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