From fd85f5c67f79e35110d86b1f1d8faf9b9f38c516 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 26 Jan 2023 16:29:48 -0600 Subject: [PATCH] Buff scythes, goats, and plantbgone vs PLANT biotypes (#72889) ## About The Pull Request This buffs scythes, goats, and plantbgone vs PLANT biotypes: - Scythes now deal x1.5 damage to venus flytraps (3 hits to kill) - Scythes now target the flower bud vines - Goats now target flower bud vines and deal 15 damage to PLANT biotypes - Goats have a eating sound whenever they bite PLANT biotypes - Plantbgone now does 2 dmg per unit to PLANT biotypes (10 dmg per spray) - Plantbgone now has a 75% chance to remove weeds and deals large damage to flower buds - Weed control crates now come with a pair of leather gloves - Golems are immune to thorn effects - Any kind of thick glove material will prevent thorn effects when attacking - Flower buds will now take x4 damage from fire and sharp weapons (unless they have fire trait) - Regular scythes are now a sharp object Also this fixes a few runtimes with spacevines and nulls. The bane element now accepts `mob_biotypes` bitflags as an argument. ## Why It's Good For The Game Before my changes: - Plant-b-gone was doing 0.4 dmg per unit to PLANT biotypes (2 dmg per spray) - Scythes took 5 hits to kill venus flytraps - Goats only affected podpeople - Flower bud vines were being ignored by weed killing code - Plantbgone only had a 50% chance to remove weeds (and this was very inconsistent due to RNG) - Botanical gloves and thick gloves didn't protect from thorns - Golems were getting pierced by thorns despite having pierce immunity - Flower buds were not taking the x4 damage like they should have been - Regular scythes were not a sharp object, but other scythes (chaplain's, megafauna loot) were sharp This makes the weed killer crate more effective since people were complaining about it being worthless vs vines and flower buds. These changes give people more options to respond to threats vs plants. ## Changelog :cl: add: Add a pair of leather gloves to weed control crate balance: Mobs with the PLANT biotypes (venus flytraps, pod people, killer tomatoes) are now much weaker vs scythes, goats, and plantbgone. balance: Plantbgone is now more effective at destroying weeds. balance: Regular scythes are now a sharp object fix: Fixed scythes, goats, and plantbgone not affecting flower bud vines. fix: Thick and botanical gloves not protecting from thorns fix: Golems not having pierce immunity from thorns fix: Runtime where vines tried to spread into null turf fix: Runtime where null vines that were destroyed were trying to spread to nearby turfs soundadd: Add eat food sound when goats eat plants code: Improved goat targeting code code: The bane element now accepts `mob_biotypes` bitflags as an argument. /:cl: --- code/datums/components/fantasy/suffixes.dm | 2 +- code/datums/elements/bane.dm | 26 ++++++-- code/game/objects/items/holy_weapons.dm | 5 +- code/modules/art/statues.dm | 2 +- code/modules/cargo/packs/emergency.dm | 3 +- code/modules/events/spacevine.dm | 26 ++++++-- code/modules/hydroponics/hydroitemdefines.dm | 21 ++++--- .../modules/mining/lavaland/megafauna_loot.dm | 1 + code/modules/mob/living/living.dm | 1 + .../simple_animal/friendly/farm_animals.dm | 63 +++++++++++++------ .../simple_animal/hostile/venus_human_trap.dm | 10 +++ .../mob_spawn/ghost_roles/venus_human_trap.dm | 1 + .../chemistry/reagents/toxin_reagents.dm | 13 +++- 13 files changed, 129 insertions(+), 45 deletions(-) diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index 1c49bace23e..4e38d61b0d1 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -76,7 +76,7 @@ // This works even with the species picks since we're only accessing the name var/obj/item/master = comp.parent - master.AddElement(/datum/element/bane, picked_mobtype) + master.AddElement(/datum/element/bane, target_type = picked_mobtype) target_types_by_comp[comp] = picked_mobtype return "[newName] of [initial(picked_mobtype.name)] slaying" diff --git a/code/datums/elements/bane.dm b/code/datums/elements/bane.dm index ce149e98dca..e050c41b61c 100644 --- a/code/datums/elements/bane.dm +++ b/code/datums/elements/bane.dm @@ -1,4 +1,7 @@ -/// Deals extra damage to mobs of a certain type or species. +/// Deals extra damage to mobs of a certain type, species, or biotype. +/// This doesn't directly modify the normal damage of the weapon, instead it applies it's own damage seperatedly ON TOP of normal damage +/// ie. a sword that does 10 damage with a bane elment attacthed that has a 0.5 damage_multiplier will do: +/// 10 damage from the swords normal attack + 5 damage (50%) from the bane element /datum/element/bane element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 @@ -10,8 +13,10 @@ var/added_damage /// If it requires combat mode on to deal the extra damage or not. var/requires_combat_mode + /// if we want it to only affect a certain mob biotype + var/mob_biotypes -/datum/element/bane/Attach(datum/target, target_type, damage_multiplier=1, added_damage = 0, requires_combat_mode = TRUE) +/datum/element/bane/Attach(datum/target, target_type = /mob/living, mob_biotypes = NONE, damage_multiplier=1, added_damage = 0, requires_combat_mode = TRUE) . = ..() if(!isitem(target)) return ELEMENT_INCOMPATIBLE @@ -27,23 +32,34 @@ src.damage_multiplier = damage_multiplier src.added_damage = added_damage src.requires_combat_mode = requires_combat_mode + src.mob_biotypes = mob_biotypes /datum/element/bane/Detach(datum/source) UnregisterSignal(source, COMSIG_ITEM_AFTERATTACK) return ..() -/datum/element/bane/proc/species_check(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/element/bane/proc/species_check(obj/item/source, mob/living/target, mob/user, proximity_flag, click_parameters) SIGNAL_HANDLER - if(!proximity_flag || !is_species(target, target_type)) + if(!proximity_flag || !istype(target) || !is_species(target, target_type)) return + + var/is_correct_biotype = target.mob_biotypes & mob_biotypes + if(mob_biotypes && !(is_correct_biotype)) + return + activate(source, target, user) -/datum/element/bane/proc/mob_check(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/element/bane/proc/mob_check(obj/item/source, mob/living/target, mob/user, proximity_flag, click_parameters) SIGNAL_HANDLER if(!proximity_flag || !istype(target, target_type)) return + + var/is_correct_biotype = target.mob_biotypes & mob_biotypes + if(mob_biotypes && !(is_correct_biotype)) + return + activate(source, target, user) /datum/element/bane/proc/activate(obj/item/source, mob/living/target, mob/living/attacker) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 695bdd7f279..4222f9d4bb9 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -30,7 +30,8 @@ on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \ effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune)) - AddElement(/datum/element/bane, /mob/living/simple_animal/revenant, 0, 25, FALSE) + AddElement(/datum/element/bane, target_type = /mob/living/simple_animal/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) + if(!GLOB.holy_weapon_type && istype(src, /obj/item/nullrod)) var/list/rods = list() for(var/obj/item/nullrod/nullrod_type as anything in typesof(/obj/item/nullrod)) @@ -253,7 +254,7 @@ speed = 7 SECONDS, \ effectiveness = 110, \ ) - //the harvest gives a high bonus chance + AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) /obj/item/nullrod/scythe/vibro name = "high frequency blade" diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index c29c9957774..639234f27a7 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -298,7 +298,7 @@ AddElement(/datum/element/eyestab) AddElement(/datum/element/wall_engraver) //deals 200 damage to statues, meaning you can actually kill one in ~250 hits - AddElement(/datum/element/bane, /mob/living/simple_animal/hostile/netherworld/statue, damage_multiplier = 40) + AddElement(/datum/element/bane, target_type = /mob/living/simple_animal/hostile/netherworld/statue, damage_multiplier = 40) /obj/item/chisel/Destroy() prepared_block = null diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm index 8e55d887389..07b48042748 100644 --- a/code/modules/cargo/packs/emergency.dm +++ b/code/modules/cargo/packs/emergency.dm @@ -170,11 +170,12 @@ /datum/supply_pack/emergency/weedcontrol name = "Weed Control Crate" - desc = "Keep those invasive species OUT. Contains a scythe, gasmask, and two anti-weed chemical grenades. \ + desc = "Keep those invasive species OUT. Contains a scythe, leather gloves, gasmask, and two anti-weed chemical grenades. \ Warranty void if used on ambrosia." cost = CARGO_CRATE_VALUE * 2.5 access = ACCESS_HYDROPONICS contains = list(/obj/item/scythe, + /obj/item/clothing/gloves/botanic_leather, /obj/item/clothing/mask/gas, /obj/item/grenade/chem_grenade/antiweed = 2, ) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 364c1859c86..25ac4a7ce49 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -255,7 +255,7 @@ var/obj/item/bodypart/limb = victim.get_bodypart(victim.get_random_valid_zone(even_weights = TRUE)) //Picks a random bodypart. var/armor = victim.run_armor_check(limb, MELEE, null, null) //armor = the armor value of that randomly chosen bodypart. Nulls to not print a message, because it would still print on pierce. var/datum/spacevine_mutation/thorns/thorn = locate() in vine.mutations //Searches for the thorns mutation in the "mutations"-list inside obj/structure/spacevine, and defines T if it finds it. - if(thorn && (prob(40))) //If we found the thorns mutation there is now a chance to get stung instead of lashed or smashed. + if(thorn && prob(40) && !HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) //If we found the thorns mutation there is now a chance to get stung instead of lashed or smashed. victim.apply_damage(50, BRUTE, def_zone = limb, wound_bonus = rand(-20,10), sharpness = SHARP_POINTY) //This one gets a bit lower damage because it ignores armor. victim.Stun(1 SECONDS) //Stopped in place for a moment. playsound(living_mob, 'sound/weapons/pierce.ogg', 50, TRUE, -1) @@ -263,7 +263,7 @@ span_userdanger("You are nailed by a sharp thorn!")) log_combat(vine, living_mob, "aggressively pierced") //"Aggressively" for easy ctrl+F'ing in the attack logs. else - if(prob(80)) + if(prob(80) && !HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) victim.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = SHARP_EDGED) victim.Knockdown(2 SECONDS) playsound(victim, 'sound/weapons/whip.ogg', 50, TRUE, -1) @@ -363,17 +363,30 @@ quality = NEGATIVE /datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/holder, mob/living/crosser) + if(istype(crosser) && HAS_TRAIT(crosser, TRAIT_PIERCEIMMUNE)) + return + if(prob(THORN_MUTATION_CUT_PROB) && istype(crosser) && !isvineimmune(crosser)) var/mob/living/victim = crosser victim.adjustBruteLoss(15) to_chat(victim, span_danger("You cut yourself on the thorny vines.")) /datum/spacevine_mutation/thorns/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/item, expected_damage) + if(iscarbon(hitter)) + var/mob/living/carbon/carbon_victim = hitter + for(var/obj/item/clothing/worn_item in carbon_victim.get_equipped_items()) + if((worn_item.body_parts_covered & HANDS) && (worn_item.clothing_flags & THICKMATERIAL)) + return expected_damage + + if(HAS_TRAIT(hitter, TRAIT_PIERCEIMMUNE) || HAS_TRAIT(hitter, TRAIT_PLANT_SAFE)) + return expected_damage + if(prob(THORN_MUTATION_CUT_PROB) && istype(hitter) && !isvineimmune(hitter)) var/mob/living/victim = hitter victim.adjustBruteLoss(15) to_chat(victim, span_danger("You cut yourself on the thorny vines.")) - . = expected_damage + + return expected_damage /datum/spacevine_mutation/woodening name = "Hardened" @@ -485,7 +498,7 @@ for(var/datum/spacevine_mutation/mutation in mutations) override += mutation.on_chem(src, chem) if(!override && istype(chem, /datum/reagent/toxin/plantbgone)) - if(prob(50)) + if(prob(75)) qdel(src) /obj/structure/spacevine/proc/eat(mob/eater) @@ -655,7 +668,7 @@ /// Actual maximum spread rate for this process tick var/spread_max = round(clamp(delta_time * (spread_base + start_spread_bonus), max(delta_time * minimum_spread_rate, 1), spread_cap)) var/amount_processed = 0 - for(var/obj/structure/spacevine/vine as anything in growth_queue) + for(var/obj/structure/spacevine/vine in growth_queue) if(!vine.can_spread) continue growth_queue -= vine @@ -713,6 +726,9 @@ /obj/structure/spacevine/proc/spread() var/direction = pick(GLOB.cardinals) var/turf/stepturf = get_step(src, direction) + if(!istype(stepturf)) + return + if(!isspaceturf(stepturf) && stepturf.Enter(src)) var/obj/structure/spacevine/spot_taken = locate() in stepturf //Locates any vine on target turf. Calls that vine "spot_taken". var/datum/spacevine_mutation/vine_eating/eating = locate() in mutations //Locates the vine eating trait in our own seed and calls it E. diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 0de9f0cf592..19ff2227136 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -521,6 +521,7 @@ attack_verb_continuous = list("chops", "slices", "cuts", "reaps") attack_verb_simple = list("chop", "slice", "cut", "reap") hitsound = 'sound/weapons/bladeslice.ogg' + sharpness = SHARP_EDGED var/swiping = FALSE /obj/item/scythe/Initialize(mapload) @@ -529,6 +530,7 @@ speed = 9 SECONDS, \ effectiveness = 105, \ ) + AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) /obj/item/scythe/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is beheading [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -540,18 +542,23 @@ playsound(src, SFX_DESECRATION ,50, TRUE, -1) return BRUTELOSS -/obj/item/scythe/pre_attack(atom/A, mob/living/user, params) - if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user)) +/obj/item/scythe/pre_attack(atom/target, mob/living/user, params) + if(!istype(target, /obj/structure/alien/resin/flower_bud) && !istype(target, /obj/structure/spacevine)) + return ..() + if(swiping || get_turf(target) == get_turf(user)) return ..() var/turf/user_turf = get_turf(user) - var/dir_to_target = get_dir(user_turf, get_turf(A)) + var/dir_to_target = get_dir(user_turf, get_turf(target)) swiping = TRUE var/static/list/scythe_slash_angles = list(0, 45, 90, -45, -90) for(var/i in scythe_slash_angles) - var/turf/T = get_step(user_turf, turn(dir_to_target, i)) - for(var/obj/structure/spacevine/V in T) - if(user.Adjacent(V)) - melee_attack_chain(user, V) + var/turf/adjacent_turf = get_step(user_turf, turn(dir_to_target, i)) + for(var/obj/structure/spacevine/vine in adjacent_turf) + if(user.Adjacent(vine)) + melee_attack_chain(user, vine) + for(var/obj/structure/alien/resin/flower_bud/flower in adjacent_turf) + if(user.Adjacent(flower)) + melee_attack_chain(user, flower) swiping = FALSE return TRUE diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 40ebc34960e..7cd04fad8ba 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -386,6 +386,7 @@ RegisterSignal(soul, COMSIG_MOB_ATTACK_RANGED, PROC_REF(on_attack)) RegisterSignal(soul, COMSIG_MOB_ATTACK_RANGED_SECONDARY, PROC_REF(on_secondary_attack)) RegisterSignal(src, COMSIG_ATOM_INTEGRITY_CHANGED, PROC_REF(on_integrity_change)) + AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) /obj/item/soulscythe/examine(mob/user) . = ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 42a2657d939..7849bf9fd63 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -563,6 +563,7 @@ return if(new_resting == resting) return + . = resting resting = new_resting if(new_resting) 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 9cf65380fc4..b17ffcf33e6 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -60,8 +60,16 @@ return for(var/direction in shuffle(list(1,2,4,8,5,6,9,10))) - var/step = get_step(src, direction) - if(step && ((locate(/obj/structure/spacevine) in step) || (locate(/obj/structure/glowshroom) in step))) + var/turf/step = get_step(src, direction) + + if(!istype(step)) + return + + var/vine = locate(/obj/structure/spacevine) in step + var/mushroom = locate(/obj/structure/glowshroom) in step + var/flower = locate(/obj/structure/alien/resin/flower_bud) in step + + if(vine || mushroom || flower) Move(step, get_dir(src, step)) /mob/living/simple_animal/hostile/retaliate/goat/Retaliate() @@ -74,29 +82,44 @@ eat_plants() /mob/living/simple_animal/hostile/retaliate/goat/proc/eat_plants() - var/eaten = FALSE - var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc - if(SV) - SV.eat(src) - eaten = TRUE + var/obj/structure/spacevine/vine = locate(/obj/structure/spacevine) in loc + if(vine) + vine.eat(src) - var/obj/structure/glowshroom/GS = locate(/obj/structure/glowshroom) in loc - if(GS) - qdel(GS) - eaten = TRUE + var/obj/structure/alien/resin/flower_bud/flower = locate(/obj/structure/alien/resin/flower_bud) in loc + if(flower) + flower.take_damage(rand(30, 50), BRUTE, 0) - if(eaten && prob(10)) - say("Nom") + var/obj/structure/glowshroom/mushroom = locate(/obj/structure/glowshroom) in loc + if(mushroom) + qdel(mushroom) + + if((vine || flower || mushroom) && prob(10)) + say("Nom") // bon appetit + playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) /mob/living/simple_animal/hostile/retaliate/goat/AttackingTarget() . = ..() - if(. && ishuman(target)) - var/mob/living/carbon/human/H = target - if(istype(H.dna.species, /datum/species/pod)) - var/obj/item/bodypart/NB = pick(H.bodyparts) - H.visible_message(span_warning("[src] takes a big chomp out of [H]!"), \ - span_userdanger("[src] takes a big chomp out of your [NB]!")) - NB.dismember() + + if(!. || !isliving(target)) + return + + var/mob/living/plant_target = target + if(!(plant_target.mob_biotypes & MOB_PLANT)) + return + + plant_target.adjustBruteLoss(20) + playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) + var/obj/item/bodypart/edible_bodypart + + if(ishuman(plant_target)) + var/mob/living/carbon/human/plant_man = target + edible_bodypart = pick(plant_man.bodyparts) + edible_bodypart.dismember() + + plant_target.visible_message(span_warning("[src] takes a big chomp out of [plant_target]!"), \ + span_userdanger("[src] takes a big chomp out of your [edible_bodypart || "body"]!")) + /mob/living/simple_animal/chick name = "\improper chick" 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 0dd87f204b1..cc7b45abdd4 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 @@ -20,6 +20,7 @@ opacity = FALSE canSmoothWith = null smoothing_flags = NONE + density = FALSE /// The amount of time it takes to create a venus human trap. var/growth_time = 120 SECONDS var/growth_icon = 0 @@ -59,6 +60,15 @@ damage_amount = 0 . = ..() +/obj/structure/alien/resin/flower_bud/attacked_by(obj/item/item, mob/living/user) + var/damage_dealt = item.force + if(item.damtype == BURN) + damage_dealt *= 4 + if(item.get_sharpness()) + damage_dealt *= 16 // alien resin applies 75% reduction to brute damage so this actually x4 damage + + take_damage(damage_dealt, item.damtype, MELEE, 1) + /obj/structure/alien/resin/flower_bud/Destroy() QDEL_LIST(vines) QDEL_NULL(countdown) diff --git a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm index 6d1e0b9e438..0a8329128d9 100644 --- a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm +++ b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm @@ -5,6 +5,7 @@ icon = 'icons/effects/spacevines.dmi' icon_state = "bud0" mob_type = /mob/living/simple_animal/hostile/venus_human_trap + density = FALSE prompt_name = "venus human trap" you_are_text = "You are a venus human trap." flavour_text = "You are a venus human trap! Protect the kudzu at all costs, and feast on those who oppose you!" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 95cd1965f00..f05461e37a5 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -73,7 +73,7 @@ return mytray.mutation_roll(user) - + mytray.adjust_toxic(3) //It is still toxic, mind you, but not to the same degree. #define LIQUID_PLASMA_BP (50+T0C) @@ -364,7 +364,10 @@ . = ..() if(istype(exposed_obj, /obj/structure/alien/weeds)) var/obj/structure/alien/weeds/alien_weeds = exposed_obj - alien_weeds.take_damage(rand(15,35), BRUTE, 0) // Kills alien weeds pretty fast + alien_weeds.take_damage(rand(15, 35), BRUTE, 0) // Kills alien weeds pretty fast + if(istype(exposed_obj, /obj/structure/alien/resin/flower_bud)) + var/obj/structure/alien/resin/flower_bud/flower = exposed_obj + flower.take_damage(rand(30, 50), BRUTE, 0) else if(istype(exposed_obj, /obj/structure/glowshroom)) //even a small amount is enough to kill it qdel(exposed_obj) else if(istype(exposed_obj, /obj/structure/spacevine)) @@ -375,9 +378,13 @@ . = ..() var/damage = min(round(0.4 * reac_volume, 0.1), 10) if(exposed_mob.mob_biotypes & MOB_PLANT) - exposed_mob.adjustToxLoss(damage, required_biotype = affected_biotype) + // spray bottle emits 5u so it's dealing ~15 dmg per spray + exposed_mob.adjustToxLoss(damage * 20, required_biotype = affected_biotype) + return + if(!(methods & VAPOR) || !iscarbon(exposed_mob)) return + var/mob/living/carbon/exposed_carbon = exposed_mob if(!exposed_carbon.wear_mask) exposed_carbon.adjustToxLoss(damage, required_biotype = affected_biotype)