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"