diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index dfc510b6492..c36e87f4491 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -115,12 +115,45 @@ proc/populate_seed_list()
// Special traits.
var/produces_power // Can be used to make a battery.
- var/thorny // Harvested thorns can act as syringes for injecting plant reagents.
var/juicy // When thrown, causes a splatter decal.
+ var/thorny // Can cause damage/inject reagents when thrown or handled.
var/explosive // When thrown, acts as a grenade.
var/teleporting // Uses the bluespace tomato effect.
var/splat_type = /obj/effect/decal/cleanable/tomato_smudge
+// Adds reagents to a target.
+/datum/seed/proc/do_thorns(var/mob/living/carbon/human/target)
+ if(!istype(target))
+ return
+
+ var/datum/organ/external/affecting = target.get_organ(pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin"))
+ var/damage = 0
+
+ if(carnivorous == 2)
+ target << "The thorns pierce your flesh greedily!"
+ damage = potency/2
+ else
+ if(affecting)
+ target << "Several thorns dig deeply into your [affecting.display_name]!"
+ else
+ target << "Several thorns dig deeply into your flesh!"
+ damage = potency/5
+
+ if(affecting)
+ affecting.take_damage(damage, 0)
+ affecting.add_autopsy_data("Thorns",damage)
+ else
+ target.adjustBruteLoss(damage)
+ target.UpdateDamageIcon()
+ target.updatehealth()
+
+ // Inject some chems.
+ if(chems && chems.len)
+ target << "You feel something seeping into your flesh!"
+ for(var/rid in chems)
+ var/injecting = min(5,max(1,potency/5))
+ target.reagents.add_reagent(rid,injecting)
+
//Applies an effect to a target atom.
/datum/seed/proc/thrown_at(var/obj/item/thrown,var/atom/target)
@@ -130,11 +163,10 @@ proc/populate_seed_list()
splatted = apply_special_effect(target,thrown)
else if(istype(target,/turf))
splatted = 1
- for(var/mob/living/M in target,thrown)
+ for(var/mob/living/M in target.contents)
apply_special_effect(M)
if(juicy && splatted)
-
if(thrown.reagents)
thrown.reagents.reaction(get_turf(target))
for(var/atom/hit_atom in get_turf(target))
@@ -147,33 +179,33 @@ proc/populate_seed_list()
/datum/seed/proc/apply_special_effect(var/mob/living/target,var/obj/item/thrown)
var/impact = 1
-
// Thorns have a chance of injecting reagents.
- if(thorny && prob(50))
- target << "Several thorns are embedded in your flesh!"
- //Todo: cause brute, transfer some reagents over.
+ if(thorny && prob(potency*5))
+ do_thorns(target)
// Bluespace tomato code copied over from grown.dm.
if(teleporting)
//Plant potency determines radius of teleport.
- var/outer_teleport_radius = potency/10
+ var/outer_teleport_radius = potency/5
var/inner_teleport_radius = potency/15
- var/list/turfs
+ var/list/turfs = list()
if(inner_teleport_radius > 0)
- turfs = orange(target,outer_teleport_radius) - orange(target,inner_teleport_radius)
+ for(var/turf/T in orange(target,outer_teleport_radius))
+ if(get_dist(target,T) >= inner_teleport_radius)
+ turfs |= T
- if(!turfs.len)
- target.visible_message("The [thrown.name] has been squashed.","You hear a smack.")
- del(thrown)
- return
+ if(turfs.len)
+ // Moves the mob, causes sparks.
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, get_turf(target))
+ s.start()
+ var/turf/picked = get_turf(pick(turfs)) // Just in case...
+ new/obj/effect/decal/cleanable/molten_item(get_turf(target)) // Leave a pile of goo behind for dramatic effect...
+ target.loc = picked // And teleport them to the chosen location.
- // Moves the mob, causes sparks.
- var/turf/picked = pick(turfs)
- new/obj/effect/decal/cleanable/molten_item(picked) //Leave a pile of goo behind for dramatic effect...
- target.loc = picked//And teleport them to the chosen location.
- impact = 1
+ impact = 1
return impact
diff --git a/code/modules/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm
index 24e7502669b..59b057028de 100644
--- a/code/modules/hydroponics/vines.dm
+++ b/code/modules/hydroponics/vines.dm
@@ -107,38 +107,7 @@
// FEED ME, SEYMOUR.
if(buckled_mob && seed && (buckled_mob.stat != DEAD)) //Don't bother with a dead mob.
-
- var/mob/living/M = buckled_mob
- if(!istype(M)) return
- var/mob/living/carbon/human/H = buckled_mob
-
- // Drink some blood/cause some brute.
- if(seed.carnivorous == 2)
- buckled_mob << "\The [src] pierces your flesh greedily!"
-
- var/damage = rand(round(seed.potency/2),seed.potency)
- if(!istype(H))
- H.adjustBruteLoss(damage)
- return
-
- var/datum/organ/external/affecting = H.get_organ(pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin"))
-
- if(affecting)
- affecting.take_damage(damage, 0)
- if(affecting.parent)
- affecting.parent.add_autopsy_data("[plant_damage_noun]", damage)
- else
- H.adjustBruteLoss(damage)
-
- H.UpdateDamageIcon()
- H.updatehealth()
-
- // Inject some chems.
- if(seed.chems && seed.chems.len && istype(H))
- H << "You feel something seeping into your skin!"
- for(var/rid in seed.chems)
- var/injecting = min(5,max(1,seed.potency/5))
- H.reagents.add_reagent(rid,injecting)
+ seed.do_thorns(buckled_mob)
/obj/effect/plantsegment/proc/update()
if(!seed) return
diff --git a/code/modules/reagents/reagent_containers/food/snacks/grown.dm b/code/modules/reagents/reagent_containers/food/snacks/grown.dm
index bc925d88228..38d01278063 100644
--- a/code/modules/reagents/reagent_containers/food/snacks/grown.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks/grown.dm
@@ -62,26 +62,37 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- if(seed && seed.produces_power)
- if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = W
- if(C.use(5))
- //TODO: generalize this.
- user << "You add some cable to the [src.name] and slide it inside the battery encasing."
- var/obj/item/weapon/cell/potato/pocell = new /obj/item/weapon/cell/potato(user.loc)
- pocell.maxcharge = src.potency * 10
- pocell.charge = pocell.maxcharge
- del(src)
- return
+ if(seed && seed.produces_power && istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
+ if(C.use(5))
+ //TODO: generalize this.
+ user << "You add some cable to the [src.name] and slide it inside the battery encasing."
+ var/obj/item/weapon/cell/potato/pocell = new /obj/item/weapon/cell/potato(get_turf(user))
+ if(src.loc == user && !(user.l_hand && user.r_hand) && istype(user,/mob/living/carbon/human))
+ user.put_in_hands(pocell)
+ pocell.maxcharge = src.potency * 10
+ pocell.charge = pocell.maxcharge
+ del(src)
+ return
/obj/item/weapon/reagent_containers/food/snacks/grown/attack_self(mob/user as mob)
- if(!seed || !seed.spread != 1)
+ if(!seed)
return
if(istype(user.loc,/turf/space))
return
+ if(user.a_intent == "hurt")
+ user.visible_message("\The [user] squashes \the [src]!")
+ seed.thrown_at(src,user)
+ sleep(-1)
+ if(src) del(src)
+ return
+
+ if(seed.spread == 0)
+ return
+
// TODO: Generalize.
var/obj/effect/glowshroom/planted = new /obj/effect/glowshroom(user.loc)
planted.delay = 50