diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index 6f5aaaf2b93..157fa1c30b9 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -81,4 +81,3 @@
#define NO_INTORGANS "no_internal_organs"
#define CAN_WINGDINGS "can_wingdings"
#define NO_CLONESCAN "no_clone_scan"
-#define IS_PLANT "is_plant" // Convert this to a biotype TODO
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 9c8a197d84f..52ea8a174f9 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -13,6 +13,19 @@
#define DROPLIMB_BLUNT 1
#define DROPLIMB_BURN 2
+//Mob bio-types flags
+#define MOB_ORGANIC (1 << 0)
+#define MOB_MINERAL (1 << 1)
+#define MOB_ROBOTIC (1 << 2)
+#define MOB_UNDEAD (1 << 3)
+#define MOB_HUMANOID (1 << 4)
+#define MOB_BUG (1 << 5)
+#define MOB_BEAST (1 << 6) // Not meant for human species, generally
+#define MOB_EPIC (1 << 7) //megafauna
+#define MOB_REPTILE (1 << 8)
+#define MOB_SPIRIT (1 << 9)
+#define MOB_PLANT (1 << 10)
+
#define AGE_MIN 17 //youngest a character can be
#define AGE_MAX 85 //oldest a character can be
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index a842778d76e..963a56f9cbd 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -92,6 +92,7 @@
health = maxHealth
name = "blob zombie"
desc = "A shambling corpse animated by the blob."
+ mob_biotypes |= MOB_HUMANOID
melee_damage_lower = 10
melee_damage_upper = 15
icon = H.icon
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index e9a218b240b..e49d6ad545e 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -113,6 +113,8 @@
mind_control_duration = 3000
/obj/item/organ/internal/heart/gland/heals/activate()
+ if(!(owner.mob_biotypes & MOB_ORGANIC))
+ return
to_chat(owner, "You feel curiously revitalized.")
owner.adjustToxLoss(-20)
owner.adjustBruteLoss(-20)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index c2d92ee8ec7..6c6388e5e70 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -60,6 +60,7 @@
desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely."
speak_emote = list("tones")
bubble_icon = "swarmer"
+ mob_biotypes = MOB_ROBOTIC
health = 40
maxHealth = 40
status_flags = CANPUSH
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index 7ae70286755..b0194c53f33 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -12,6 +12,7 @@
icon_living = "magicOrange"
icon_dead = "magicOrange"
speed = 0
+ mob_biotypes = NONE
a_intent = INTENT_HARM
can_change_intents = 0
stop_automated_movement = 1
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index f76ddbd64dd..fb46533b817 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -15,6 +15,7 @@
var/icon_reveal = "revenant_revealed"
var/icon_stun = "revenant_stun"
var/icon_drain = "revenant_draining"
+ mob_biotypes = MOB_SPIRIT
incorporeal_move = 3
see_invisible = INVISIBILITY_REVENANT
invisibility = INVISIBILITY_REVENANT
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 507e63cb873..b488e0a826c 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -15,6 +15,7 @@
icon_living = "daemon"
speed = 1
a_intent = INTENT_HARM
+ mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
stop_automated_movement = 1
status_flags = CANPUSH
attack_sound = 'sound/misc/demon_attack1.ogg'
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 4cd2d1847d9..d5c76b1dd97 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -2,6 +2,7 @@
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,GLAND_HUD)
pressure_resistance = 25
+ mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
//Marking colour and style
var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
var/list/m_styles = DEFAULT_MARKING_STYLES //All markings set to None.
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index bb721aba59b..179351afb97 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -83,6 +83,8 @@
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
var/remains_type = /obj/effect/decal/remains/human //What sort of remains is left behind when the species dusts
var/base_color //Used when setting species.
+ /// bitfield of biotypes the mob belongs to.
+ var/inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID
var/list/inherent_factions
//Used in icon caching.
@@ -285,6 +287,8 @@
H.hud_used.update_locked_slots()
H.ventcrawler = ventcrawler
+ H.mob_biotypes = inherent_biotypes
+
for(var/X in inherent_traits)
ADD_TRAIT(H, X, SPECIES_TRAIT)
diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm
index 4fffa6907a1..bd3e85bf645 100644
--- a/code/modules/mob/living/carbon/human/species/diona.dm
+++ b/code/modules/mob/living/carbon/human/species/diona.dm
@@ -20,8 +20,8 @@
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
water and other radiation."
- species_traits = list(IS_PLANT)
inherent_traits = list(TRAIT_NOGERMS, TRAIT_NODECAY)
+ inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT
clothing_flags = HAS_SOCKS
default_hair_colour = "#000000"
has_gender = FALSE
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index f48f39b044c..b83b2e95a5f 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -6,6 +6,7 @@
species_traits = list(NO_BLOOD)
inherent_traits = list(TRAIT_RESISTHEAT, TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_NOFIRE, TRAIT_CHUNKYFINGERS, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOPAIN)
+ inherent_biotypes = MOB_HUMANOID | MOB_MINERAL
dies_at_threshold = TRUE
speed_mod = 2
brute_mod = 0.45 //55% damage reduction
@@ -313,9 +314,9 @@
name = "Wood Golem"
golem_colour = rgb(158, 112, 75)
skinned_type = /obj/item/stack/sheet/wood
- species_traits = list(NO_BLOOD, IS_PLANT) // Refactor into biotype
//Can burn and take damage from heat
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_CHUNKYFINGERS, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOPAIN)
+ inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT
brute_mod = 0.7 //30% damage reduction down from 55%
burn_mod = 0.875
tox_mod = 0.7
diff --git a/code/modules/mob/living/carbon/human/species/kidan.dm b/code/modules/mob/living/carbon/human/species/kidan.dm
index c60e1855841..68ccfbb37a4 100644
--- a/code/modules/mob/living/carbon/human/species/kidan.dm
+++ b/code/modules/mob/living/carbon/human/species/kidan.dm
@@ -10,6 +10,7 @@
tox_mod = 1.7
species_traits = list(IS_WHITELISTED)
+ inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_BUG
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS
eyes = "kidan_eyes_s"
diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm
index b329c268b5f..8dfae64dcee 100644
--- a/code/modules/mob/living/carbon/human/species/machine.dm
+++ b/code/modules/mob/living/carbon/human/species/machine.dm
@@ -23,6 +23,7 @@
species_traits = list(IS_WHITELISTED, NO_BLOOD, NO_CLONESCAN, NO_INTORGANS, NOTRANSSTING)
inherent_traits = list(TRAIT_VIRUSIMMUNE, TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_NOGERMS, TRAIT_NODECAY, TRAIT_NOPAIN, TRAIT_GENELESS) //Computers that don't decay? What a lie!
+ inherent_biotypes = MOB_ROBOTIC | MOB_HUMANOID
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS
dietflags = 0 //IPCs can't eat, so no diet
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index a99aaff7104..69f28131aa0 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -7,6 +7,7 @@
species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
inherent_traits = list(TRAIT_RADIMMUNE, TRAIT_NOHUNGER)
+ inherent_biotypes = MOB_HUMANOID | MOB_MINERAL
forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks
skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently*
dietflags = DIET_OMNI
diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm
index 10ae52768eb..b86c450f7e9 100644
--- a/code/modules/mob/living/carbon/human/species/skeleton.dm
+++ b/code/modules/mob/living/carbon/human/species/skeleton.dm
@@ -11,6 +11,7 @@
species_traits = list(NO_BLOOD)
inherent_traits = list(TRAIT_RESISTHEAT, TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOHUNGER, TRAIT_XENO_IMMUNE)
+ inherent_biotypes = MOB_UNDEAD | MOB_HUMANOID
tox_mod = 0
clone_mod = 0
dies_at_threshold = TRUE
diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm
index e1b05d3e0d0..fa829f43f68 100644
--- a/code/modules/mob/living/carbon/human/species/unathi.dm
+++ b/code/modules/mob/living/carbon/human/species/unathi.dm
@@ -15,6 +15,7 @@
their native tongue is a heavy hissing laungage called Sinta'Unathi."
species_traits = list(LIPS)
+ inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_REPTILE
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING
dietflags = DIET_CARN
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 49c4dbfca63..7f0754f9d4c 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -35,6 +35,8 @@
var/floating = FALSE
var/mob_size = MOB_SIZE_HUMAN
+ // What type of mob is this
+ var/mob_biotypes = MOB_ORGANIC
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
var/digestion_ratio = 1 //controls how quickly reagents metabolize; largely governered by species attributes.
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index afaa2f21e57..4730f854391 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -5,6 +5,7 @@
bubble_icon = "machine"
has_unlimited_silicon_privilege = 1
weather_immunities = list("ash")
+ mob_biotypes = MOB_ROBOTIC
flags_2 = RAD_PROTECT_CONTENTS_2 | RAD_NO_CONTAMINATE_2
var/syndicate = 0
var/const/MAIN_CHANNEL = "Main Frequency"
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 094a35372c1..f9a7b412ad3 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -4,6 +4,7 @@
/mob/living/simple_animal/bot
icon = 'icons/obj/aibots.dmi'
layer = MOB_LAYER - 0.1
+ mob_biotypes = MOB_ROBOTIC
light_range = 3
stop_automated_movement = 1
wander = 0
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index bafed690f1a..f1df2fb8ed7 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/construct
name = "Construct"
real_name = "Construct"
+ mob_biotypes = NONE
speak_emote = list("hisses")
emote_hear = list("wails","screeches")
response_help = "thinks better of touching"
diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
index ebf068ff130..336f0ce42d2 100644
--- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm
+++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
@@ -19,6 +19,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = 2
mob_size = MOB_SIZE_TINY
+ mob_biotypes = MOB_ORGANIC | MOB_BUG
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 0)
gold_core_spawnable = FRIENDLY_SPAWN
diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
index 0722cf7c602..e90a2f6fdc5 100644
--- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
@@ -10,6 +10,7 @@
minbodytemp = 270
maxbodytemp = INFINITY
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ mob_biotypes = MOB_ORGANIC | MOB_BUG
mob_size = MOB_SIZE_TINY
response_help = "pokes"
response_disarm = "shoos"
diff --git a/code/modules/mob/living/simple_animal/friendly/deer.dm b/code/modules/mob/living/simple_animal/friendly/deer.dm
index a10ec1b7b35..3a17387d0a9 100644
--- a/code/modules/mob/living/simple_animal/friendly/deer.dm
+++ b/code/modules/mob/living/simple_animal/friendly/deer.dm
@@ -15,4 +15,5 @@
response_disarm = "gently pushes aside"
response_harm = "kicks"
can_collar = 1
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm
index 7d6f90b7d0d..1c5053e20b9 100644
--- a/code/modules/mob/living/simple_animal/friendly/diona.dm
+++ b/code/modules/mob/living/simple_animal/friendly/diona.dm
@@ -11,6 +11,7 @@
icon_dead = "nymph_dead"
icon_resting = "nymph_sleep"
pass_flags = PASSTABLE | PASSMOB
+ mob_biotypes = MOB_ORGANIC | MOB_PLANT
mob_size = MOB_SIZE_SMALL
ventcrawler = 2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index f2e9743ff2d..b958c6a74d2 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -17,6 +17,7 @@
response_disarm = "gently pushes aside"
response_harm = "kicks"
faction = list("neutral")
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
attack_same = 1
attacktext = "kicks"
attack_sound = 'sound/weapons/punch1.ogg'
@@ -132,6 +133,7 @@
blood_volume = BLOOD_VOLUME_NORMAL
var/obj/item/udder/udder = null
gender = FEMALE
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
/mob/living/simple_animal/cow/Initialize()
udder = new()
@@ -178,6 +180,7 @@
icon_dead = "chick_dead"
icon_gib = "chick_gib"
gender = FEMALE
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
speak_emote = list("cheeps")
emote_hear = list("cheeps")
@@ -222,6 +225,7 @@ GLOBAL_VAR_INIT(chicken_count, 0)
name = "\improper chicken"
desc = "Hopefully the eggs are good this season."
gender = FEMALE
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
icon_state = "chicken_brown"
icon_living = "chicken_brown"
icon_dead = "chicken_brown_dead"
@@ -333,6 +337,7 @@ GLOBAL_VAR_INIT(chicken_count, 0)
health = 50
maxHealth = 50
can_collar = 1
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
blood_volume = BLOOD_VOLUME_NORMAL
@@ -357,6 +362,7 @@ GLOBAL_VAR_INIT(chicken_count, 0)
health = 50
maxHealth = 50
can_collar = 1
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/goose
@@ -380,6 +386,7 @@ GLOBAL_VAR_INIT(chicken_count, 0)
health = 50
maxHealth = 50
can_collar = 1
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/seal
@@ -403,6 +410,7 @@ GLOBAL_VAR_INIT(chicken_count, 0)
health = 50
maxHealth = 50
can_collar = 1
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
blood_volume = BLOOD_VOLUME_NORMAL
@@ -427,6 +435,7 @@ GLOBAL_VAR_INIT(chicken_count, 0)
health = 50
maxHealth = 50
can_collar = 1
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
blood_volume = BLOOD_VOLUME_NORMAL
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index 566791786f6..5db493be1f7 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -22,6 +22,7 @@
can_hide = 1
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 1)
can_collar = 1
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_REPTILE
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/lizard/decompile_act(obj/item/matter_decompiler/C, mob/user)
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 043d145ba64..a4ed83aa4fe 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -23,6 +23,7 @@
density = 0
ventcrawler = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
mob_size = MOB_SIZE_TINY
var/mouse_color //brown, gray and white, leave blank for random
layer = MOB_LAYER
diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm
index ac4f3367002..53be2df8892 100644
--- a/code/modules/mob/living/simple_animal/friendly/pet.dm
+++ b/code/modules/mob/living/simple_animal/friendly/pet.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/pet
icon = 'icons/mob/pets.dmi'
mob_size = MOB_SIZE_SMALL
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
blood_volume = BLOOD_VOLUME_NORMAL
can_collar = TRUE
diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm
index b4a15ba27b4..fe4fa0db6cd 100644
--- a/code/modules/mob/living/simple_animal/friendly/snake.dm
+++ b/code/modules/mob/living/simple_animal/friendly/snake.dm
@@ -29,6 +29,7 @@
ventcrawler = VENTCRAWLER_ALWAYS
density = FALSE
pass_flags = PASSTABLE | PASSMOB
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_REPTILE
mob_size = MOB_SIZE_SMALL
gold_core_spawnable = FRIENDLY_SPAWN
obj_damage = 0
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 877d542fa2b..14d2f201e98 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -21,6 +21,7 @@
response_disarm = "shoos"
response_harm = "stomps on"
speed = 0
+ mob_biotypes = MOB_ROBOTIC
mob_size = MOB_SIZE_SMALL
speak_emote = list("beeps","clicks","chirps")
diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm
index b47b0eb1f23..4e25a6708c4 100644
--- a/code/modules/mob/living/simple_animal/hostile/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bat.dm
@@ -6,6 +6,7 @@
icon_living = "bat"
icon_dead = "bat_dead"
icon_gib = "bat_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
speak_chance = 0
turns_per_move = 3
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index d5b7205f09c..e154b1b2cfd 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -6,6 +6,7 @@
icon_living = "bear"
icon_dead = "bear_dead"
icon_gib = "bear_gib"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
speak = list("RAWR!","Rawr!","GRR!","Growl!")
speak_emote = list("growls", "roars")
emote_hear = list("rawrs","grumbles","grawls")
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 3419279ffe5..ac245258c7b 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -35,6 +35,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
density = FALSE
mob_size = MOB_SIZE_TINY
+ mob_biotypes = MOB_ORGANIC | MOB_BUG
flying = TRUE
gold_core_spawnable = HOSTILE_SPAWN
search_objects = TRUE //have to find those plant trays!
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 7b0b52f0b4f..ec1baeb0bdf 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -8,6 +8,7 @@
icon_living = "base"
icon_dead = "base_dead"
icon_gib = "carp_gib"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
speak_chance = 0
turns_per_move = 5
butcher_results = list(/obj/item/reagent_containers/food/snacks/carpmeat = 2)
diff --git a/code/modules/mob/living/simple_animal/hostile/deathsquid.dm b/code/modules/mob/living/simple_animal/hostile/deathsquid.dm
index 69f5257d4dd..2cfa2877400 100644
--- a/code/modules/mob/living/simple_animal/hostile/deathsquid.dm
+++ b/code/modules/mob/living/simple_animal/hostile/deathsquid.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/deathsquid
name = "death squid"
desc = "A large, floating eldritch horror. Its body glows with an evil red light, and its tentacles look to have been dipped in alien blood."
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
speed = 1
speak_emote = list("telepathically thunders", "telepathically booms")
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 0ed560f24e9..5ccee07395e 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -4,6 +4,7 @@
icon_state = "faithless"
icon_living = "faithless"
icon_dead = "faithless_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
speak_chance = 0
turns_per_move = 5
response_help = "passes through the"
diff --git a/code/modules/mob/living/simple_animal/hostile/feral_cat.dm b/code/modules/mob/living/simple_animal/hostile/feral_cat.dm
index 4067d552089..b10cd9c761d 100644
--- a/code/modules/mob/living/simple_animal/hostile/feral_cat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/feral_cat.dm
@@ -6,6 +6,7 @@
icon_living = "cat2"
icon_dead = "cat2_dead"
gender = MALE
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
maxHealth = 20
health = 20
melee_damage_lower = 10
diff --git a/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm b/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm
index 23b9ceb2c6b..90e0aee9593 100644
--- a/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm
+++ b/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm
@@ -11,6 +11,7 @@
icon_state = "cursedclown"
icon_living = "cursedclown"
icon_gib = "clown_gib"
+ mob_biotypes = NONE
maxHealth = 200
health = 200
speed = -1
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 9211a43ae8c..38b37a2a4b3 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -12,6 +12,7 @@
var/butcher_state = 8 // Icon state for dead spider icons
icon_living = "guard"
icon_dead = "guard_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_BUG
speak_emote = list("chitters")
emote_hear = list("chitters")
speak_chance = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/hellhound.dm b/code/modules/mob/living/simple_animal/hostile/hellhound.dm
index 2ae36d88db0..d99d42e610a 100644
--- a/code/modules/mob/living/simple_animal/hostile/hellhound.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hellhound.dm
@@ -7,6 +7,7 @@
icon_living = "hellhound"
icon_dead = "hellhound_dead"
icon_resting = "hellhound_rest"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index 2b9358214b1..75ca73eb2d5 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -9,6 +9,7 @@
icon_state = "basic"
icon_living = "basic"
icon_dead = "basic"
+ mob_biotypes = MOB_ROBOTIC
health = 15
maxHealth = 15
melee_damage_lower = 2
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index 79c7e63a341..f225bbe1342 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -5,6 +5,7 @@
icon_state = "static"
icon_living = "static"
icon_dead = "null"
+ mob_biotypes = NONE
melee_damage_lower = 5
melee_damage_upper = 5
a_intent = INTENT_HARM
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm
index 934e1312606..4e6376d3b31 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm
@@ -11,6 +11,7 @@
icon_dead = "panther_dead"
icon_resting = "panther_rest"
icon_gib = "panther_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
speak_chance = 0
turns_per_move = 3
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 3)
diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
index e2c7d2e1b21..fc4876034ab 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
speak_chance = 0
turns_per_move = 5
maxHealth = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 70585b818f5..fb3049cf4d8 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -28,6 +28,7 @@ Difficulty: Medium
icon_state = "miner"
icon_living = "miner"
icon = 'icons/mob/lavaland/blood_drunk.dmi'
+ mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
light_color = "#E4C7C5"
flying = FALSE
speak_emote = list("roars")
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index e5f499a29ee..f4f011bac85 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -6,6 +6,7 @@
a_intent = INTENT_HARM
sentience_type = SENTIENCE_BOSS
environment_smash = ENVIRONMENT_SMASH_RWALLS
+ mob_biotypes = MOB_ORGANIC | MOB_EPIC
obj_damage = 400
light_range = 3
faction = list("mining", "boss")
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
index 77c710359bb..45f8222d335 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
@@ -47,6 +47,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
icon_state = "swarmer_console"
health = 750
maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe
+ mob_biotypes = MOB_ROBOTIC
internal_type = /obj/item/gps/internal/swarmer_beacon
medal_type = BOSS_MEDAL_SWARMERS
score_type = SWARMER_BEACON_SCORE
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index fbf65ccfa9b..4f193f5d725 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -12,6 +12,8 @@
maxHealth = 250
health = 250
+ mob_biotypes = NONE
+
harm_intent_damage = 5
melee_damage_lower = 8
melee_damage_upper = 12
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
index 74eaf55b57c..9f3dc477218 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
@@ -8,6 +8,7 @@
icon_aggro = "Basilisk_alert"
icon_dead = "Basilisk_dead"
icon_gib = "syndicate_gib"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
move_to_delay = 20
projectiletype = /obj/item/projectile/temp/basilisk
projectilesound = 'sound/weapons/pierce.ogg'
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm
index ea73bfb8840..b1b3c7066b8 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm
@@ -8,6 +8,7 @@
icon_aggro = "Goldgrub_alert"
icon_dead = "Goldgrub_dead"
icon_gib = "syndicate_gib"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
vision_range = 2
aggro_vision_range = 9
move_to_delay = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
index d052dd9bc23..ecf45181bdf 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
@@ -8,6 +8,7 @@
icon_aggro = "Goliath_alert"
icon_dead = "Goliath_dead"
icon_gib = "syndicate_gib"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
move_to_delay = 40
ranged = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm
index fb2c741cb30..c5c50177511 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm
@@ -6,6 +6,7 @@
icon_state = "gutlunch"
icon_living = "gutlunch"
icon_dead = "gutlunch"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
speak_emote = list("warbles", "quavers")
emote_hear = list("trills.")
emote_see = list("sniffs.", "burps.")
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
index f24e979a152..4f526d2e119 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
@@ -7,6 +7,7 @@
icon_aggro = "Hivelord_alert"
icon_dead = "Hivelord_dead"
icon_gib = "syndicate_gib"
+ mob_biotypes = MOB_ORGANIC
mouse_opacity = MOUSE_OPACITY_OPAQUE
move_to_delay = 14
ranged = 1
@@ -160,6 +161,7 @@
icon_aggro = "legion"
icon_dead = "legion"
icon_gib = "syndicate_gib"
+ mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
mouse_opacity = MOUSE_OPACITY_ICON
obj_damage = 60
melee_damage_lower = 15
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 80d07801b9e..f08d4d32637 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/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm
index d8d2d55a8ee..66f475d4863 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm
@@ -5,6 +5,7 @@
icon_state = "piratemelee"
icon_living = "piratemelee"
icon_dead = "piratemelee_dead" // Does not actually exist. del_on_death.
+ mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
speak_chance = 0
turns_per_move = 5
response_help = "pushes the"
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index f58f7fcfda2..d0dacaf5a88 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -7,6 +7,7 @@
icon_dead = "clown_dead"
icon_gib = "clown_gib"
speak_chance = 0
+ mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
turns_per_move = 5
response_help = "pokes the"
response_disarm = "gently pushes aside the"
@@ -39,6 +40,7 @@
icon_state = "clowngoblin"
icon_living = "clowngoblin"
icon_dead = null
+ mob_biotypes = MOB_ORGANIC
response_help = "honks the"
speak = list("Honk!")
speak_emote = list("sqeaks")
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index 7dfac96a807..223241426f9 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -6,6 +6,7 @@
icon_state = "drone3"
icon_living = "drone3"
icon_dead = "drone_dead"
+ mob_biotypes = MOB_ROBOTIC
ranged = 1
rapid = 3
retreat_distance = 3
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm
index ca6987d735c..1b6a54be53e 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm
@@ -5,6 +5,7 @@
icon = 'icons/mob/carp.dmi'
icon_state = "carp"
icon_gib = "carp_gib"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
speak_chance = 0
turns_per_move = 5
butcher_results = list(/obj/item/reagent_containers/food/snacks/carpmeat = 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/kangaroo.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/kangaroo.dm
index 0bd75fa4185..00bced469ce 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/kangaroo.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/kangaroo.dm
@@ -7,6 +7,7 @@
icon_living = "kangaroo"
icon_dead = "kangaroo_dead"
icon_gib = "kangaroo_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
turns_per_move = 8
response_help = "pets"
emote_hear = list("bark")
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm
index 6be9725e9aa..136e0df9245 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm
@@ -8,6 +8,7 @@
icon_living = "guard"
icon_dead = "guard_dead"
icon_gib = "guard_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_BUG
turns_per_move = 8
response_help = "pets"
emote_hear = list("chitters")
@@ -19,4 +20,4 @@
unique_pet = TRUE
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 2, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
gender = FEMALE
-
+
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
index 5d946662854..d1170289f45 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
@@ -22,6 +22,7 @@
icon_state = "ghost2"
icon_living = "ghost2"
icon_dead = "ghost"
+ mob_biotypes = MOB_SPIRIT
density = 0 // ghost
invisibility = 60 // no seriously ghost
speak_chance = 0 // fyi, ghost
@@ -69,6 +70,7 @@
icon_state = "skeleton_s"
icon_living = "skeleton_s"
icon_dead = "skeleton_l"
+ mob_biotypes = MOB_UNDEAD | MOB_HUMANOID
speak_chance = 0
turns_per_move = 10
response_help = "shakes hands with"
@@ -97,6 +99,7 @@
icon_state = "zombie_s"
icon_living = "zombie_s"
icon_dead = "zombie_l"
+ mob_biotypes = MOB_UNDEAD | MOB_HUMANOID
speak_chance = 0
turns_per_move = 10
response_help = "gently prods"
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index 83c6fa67e1d..933a2700b8a 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -6,6 +6,7 @@
icon_living = "russianmelee"
icon_dead = "russianmelee_dead" // Does not actually exist. del_on_death.
icon_gib = "russianmelee_gib" // Does not actually exist. del_on_death.
+ mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
speak_chance = 0
turns_per_move = 5
response_help = "pokes the"
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
index e0e71506bbe..58411b6abd2 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
@@ -4,6 +4,7 @@
icon = 'icons/mob/simple_human.dmi'
icon_state = "skeleton"
icon_living = "skeleton"
+ mob_biotypes = MOB_UNDEAD | MOB_HUMANOID
turns_per_move = 5
speak_emote = list("rattles")
emote_see = list("rattles")
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 105b9a02819..5ccb43272a8 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -9,6 +9,7 @@
icon_dead = "angel"
gender = NEUTER
a_intent = INTENT_HARM
+ mob_biotypes = MOB_HUMANOID
response_help = "touches"
response_disarm = "pushes"
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index b763144d6fe..4664cdedf16 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -6,6 +6,7 @@
icon_living = "syndicate"
icon_dead = "syndicate_dead" // Does not actually exist. del_on_death.
icon_gib = "syndicate_gib" // Does not actually exist. del_on_death.
+ mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
speak_chance = 0
turns_per_move = 5
response_help = "pokes the"
@@ -350,6 +351,7 @@
icon_living = "viscerator_attack"
pass_flags = PASSTABLE | PASSMOB
a_intent = INTENT_HARM
+ mob_biotypes = MOB_ROBOTIC
health = 15
maxHealth = 15
obj_damage = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
index 7b028042951..f028b98ce28 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
@@ -25,6 +25,8 @@ GLOBAL_LIST_EMPTY(ts_spiderling_list)
icon_living = "terror_red"
icon_dead = "terror_red_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_BUG
+
// Health
maxHealth = 120
health = 120
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 6881e3d7b12..18c2f941f48 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -6,6 +6,7 @@
icon_living = "pine_1"
icon_dead = "pine_1"
icon_gib = "pine_1"
+ mob_biotypes = MOB_ORGANIC | MOB_PLANT
speak_chance = 0
turns_per_move = 5
response_help = "brushes the"
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 c8e6b8c5d8e..f6827b636a3 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
@@ -49,6 +49,7 @@
name = "venus human trap"
desc = "Now you know how the fly feels."
icon_state = "venus_human_trap"
+ mob_biotypes = MOB_ORGANIC | MOB_PLANT
layer = MOB_LAYER + 0.9
health = 50
maxHealth = 50
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 73a08ef2bfd..f1715ddd314 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -53,6 +53,7 @@
response_harm = "swats"
stop_automated_movement = TRUE
universal_speak = TRUE
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
mob_size = MOB_SIZE_SMALL
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm
index 729790d098c..edeadf742fc 100644
--- a/code/modules/mob/living/simple_animal/posessed_object.dm
+++ b/code/modules/mob/living/simple_animal/posessed_object.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/possessed_object
name = "possessed doodad"
var/spirit_name = "mysterious force" // What we call ourselves in attack messages.
+ mob_biotypes = MOB_SPIRIT
health = 50
maxHealth = 50
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index d150bd4c309..181b40eb397 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -6,6 +6,7 @@
icon_state = "shade"
icon_living = "shade"
icon_dead = "shade_dead"
+ mob_biotypes = MOB_SPIRIT
maxHealth = 50
health = 50
speak_emote = list("hisses")
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index e69eec1831f..08e7b79ac33 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -66,12 +66,17 @@
max_charges = 3 //3, 2, 2, 1
/obj/item/gun/magic/wand/death/zap_self(mob/living/user)
- var/message ="You irradiate yourself with pure energy! "
- message += pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")
- to_chat(user, message)
- user.adjustFireLoss(3000)
- charges--
..()
+ charges--
+ if(isliving(user))
+ if(user.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead
+ user.revive()
+ to_chat(user, "You feel great!")
+ return
+ to_chat(user, "You irradiate yourself with pure negative energy! [pick("Do not pass go. Do not collect 200 zorkmids.", "You feel more confident in your spell casting skills.", "You Die...", "Do you want your possessions identified?")]")
+ if(ismachineperson(user)) //speshul snowfleks deserv speshul treetment
+ user.adjustFireLoss(6969)
+ user.death(FALSE)
/////////////////////////////////////
//WAND OF HEALING
@@ -86,10 +91,15 @@
max_charges = 3 //3, 2, 2, 1
/obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user)
+ ..()
+ charges--
+ if(isliving(user))
+ if(user.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead
+ to_chat(user, "You irradiate yourself with pure positive energy! [pick("Do not pass go. Do not collect 200 zorkmids.", "You feel more confident in your spell casting skills.", "You Die...", "Do you want your possessions identified?")]")
+ user.death(FALSE)
+ return
user.revive()
to_chat(user, "You feel great!")
- charges--
- ..()
/////////////////////////////////////
//WAND OF POLYMORPH
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index c8090686aa3..3d1f69b62c4 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -25,15 +25,21 @@
var/exp_flash = 3
var/exp_fire = 2
-/obj/item/projectile/magic/death/on_hit(mob/living/carbon/C)
+/obj/item/projectile/magic/death/on_hit(mob/living/carbon/target)
. = ..()
- if(isliving(C))
- if(ismachineperson(C)) //speshul snowfleks deserv speshul treetment
- C.adjustFireLoss(6969) //remember - slimes love fire
- else
- C.death()
+ if(isliving(target))
+ if(target.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead
+ if(target.revive())
+ target.grab_ghost(force = TRUE) // even suicides
+ to_chat(target, "You rise with a start, you're undead!!!")
+ else if(target.stat != DEAD)
+ to_chat(target, "You feel great!")
+ return
+ if(ismachineperson(target)) //speshul snowfleks deserv speshul treetment
+ target.adjustFireLoss(6969) //remember - slimes love fire
+ target.death(FALSE)
- visible_message("[C] topples backwards as the death bolt impacts [C.p_them()]!")
+ target.visible_message("[target] topples backwards as the death bolt impacts [target.p_them()]!")
/obj/item/projectile/magic/fireball/Range()
var/turf/T1 = get_step(src,turn(dir, -45))
@@ -73,21 +79,25 @@
name = "bolt of resurrection"
icon_state = "ion"
-/obj/item/projectile/magic/resurrection/on_hit(var/mob/living/carbon/target)
+/obj/item/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
. = ..()
if(ismob(target))
- var/old_stat = target.stat
- target.suiciding = 0
- target.revive()
- if(!target.ckey)
- for(var/mob/dead/observer/ghost in GLOB.player_list)
- if(target.real_name == ghost.real_name)
- ghost.reenter_corpse()
- break
- if(old_stat != DEAD)
- to_chat(target, "You feel great!")
+ if(target.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead
+ target.death(FALSE)
+ target.visible_message("[target] topples backwards as the death bolt impacts [target.p_them()]!")
else
- to_chat(target, "You rise with a start, you're alive!!!")
+ var/old_stat = target.stat
+ target.suiciding = FALSE
+ target.revive()
+ if(!target.ckey)
+ for(var/mob/dead/observer/ghost in GLOB.player_list)
+ if(target.real_name == ghost.real_name)
+ ghost.reenter_corpse()
+ break
+ if(old_stat != DEAD)
+ to_chat(target, "You feel great!")
+ else
+ to_chat(target, "You rise with a start, you're alive!!!")
/obj/item/projectile/magic/teleport
name = "bolt of teleportation"
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index c7e709cdcaf..739ca3ee97d 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -1040,20 +1040,19 @@
var/obj/structure/spacevine/SV = O
SV.on_chem_effect(src)
-/datum/reagent/glyphosate/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(!C.wear_mask) // If not wearing a mask
- C.adjustToxLoss(lethality)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(IS_PLANT in H.dna.species.species_traits) //plantmen take extra damage
- H.adjustToxLoss(3)
- ..()
- else if(istype(M, /mob/living/simple_animal/diona)) //nymphs take EVEN MORE damage
- var/mob/living/simple_animal/diona/D = M
- D.adjustHealth(100)
- ..()
+/datum/reagent/glyphosate/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume)
+ if(isliving(M))
+ if(M.mob_biotypes & MOB_PLANT)
+ var/damage = min(round(0.4 * volume, 0.1), 10)
+ M.adjustToxLoss(damage)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!C.wear_mask) // If not wearing a mask
+ C.adjustToxLoss(lethality)
+ if(istype(M, /mob/living/simple_animal/diona)) //nymphs take EVEN MORE damage
+ var/mob/living/simple_animal/diona/D = M
+ D.adjustHealth(100)
+ ..()
/datum/reagent/glyphosate/atrazine
name = "Atrazine"
@@ -1081,15 +1080,17 @@
O.visible_message("The ants die.")
qdel(O)
-/datum/reagent/pestkiller/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(!C.wear_mask) // If not wearing a mask
- C.adjustToxLoss(2)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(iskidan(H)) //RIP
- H.adjustToxLoss(20)
+/datum/reagent/pestkiller/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume)
+ if(isliving(M))
+ if(M.mob_biotypes & MOB_BUG)
+ var/damage = min(round(0.4 * volume, 0.1), 10)
+ M.adjustToxLoss(damage)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!C.wear_mask) // If not wearing a mask
+ C.adjustToxLoss(2)
+ if(iskidan(C)) //RIP
+ C.adjustToxLoss(18)
/datum/reagent/capulettium
name = "Capulettium"