diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm
index 717d3ea8a87..df1afc6670b 100644
--- a/code/modules/hydroponics/grown_inedible.dm
+++ b/code/modules/hydroponics/grown_inedible.dm
@@ -8,7 +8,7 @@
var/plantname
var/potency = 1
-/obj/item/weapon/grown/New()
+/obj/item/weapon/grown/New(newloc,planttype)
..()
@@ -17,21 +17,20 @@
R.my_atom = src
//Handle some post-spawn var stuff.
- spawn(1)
- // Fill the object up with the appropriate reagents.
- if(!isnull(plantname))
- var/datum/seed/S = seed_types[plantname]
- if(!S || !S.chems)
- return
+ if(planttype)
+ plantname = planttype
+ var/datum/seed/S = seed_types[plantname]
+ if(!S || !S.chems)
+ return
- potency = S.potency
+ potency = S.potency
- for(var/rid in S.chems)
- var/list/reagent_data = S.chems[rid]
- var/rtotal = reagent_data[1]
- if(reagent_data.len > 1 && potency > 0)
- rtotal += round(potency/reagent_data[2])
- reagents.add_reagent(rid,max(1,rtotal))
+ for(var/rid in S.chems)
+ var/list/reagent_data = S.chems[rid]
+ var/rtotal = reagent_data[1]
+ if(reagent_data.len > 1 && potency > 0)
+ rtotal += round(potency/reagent_data[2])
+ reagents.add_reagent(rid,max(1,rtotal))
/obj/item/weapon/grown/log
name = "towercap"
diff --git a/code/modules/hydroponics/hydro_tools.dm b/code/modules/hydroponics/hydro_tools.dm
index 957ef5173f5..10a22efe888 100644
--- a/code/modules/hydroponics/hydro_tools.dm
+++ b/code/modules/hydroponics/hydro_tools.dm
@@ -136,7 +136,7 @@
switch(grown_seed.spread)
if(1)
- dat += "
It is capable of growing beyond the confines of a tray."
+ dat += "
It is able to be planted outside of a tray."
if(2)
dat += "
It is a robust and vigorous vine that will spread rapidly."
@@ -156,6 +156,21 @@
if(grown_seed.flowers)
dat += "
It has [grown_seed.flower_colour ? "flowers" : "flowers"]."
+ if(grown_seed.produces_power)
+ user << "
The fruit will function as a battery if prepared appropriately."
+
+ if(grown_seed.thorny)
+ user << "
The fruit is covered in sharp, hollow thorns."
+
+ if(grown_seed.juicy)
+ user << "
The fruit is excessively juicy."
+
+ if(grown_seed.explosive)
+ user << "
The fruit is internally unstable."
+
+ if(grown_seed.teleporting)
+ user << "
The fruit is temporal/spatially unstable."
+
if(dat)
user << browse(dat,"window=plant_analyzer")
diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm
index eafff17b073..b082a609bc1 100644
--- a/code/modules/hydroponics/hydro_tray.dm
+++ b/code/modules/hydroponics/hydro_tray.dm
@@ -642,12 +642,7 @@
user << "You plant the [S.seed.seed_name] [S.seed.seed_noun]."
- if(S.seed.spread == 1)
- msg_admin_attack("[key_name(user)] has planted a creeper packet.")
- var/obj/effect/plant_controller/creeper/PC = new(get_turf(src))
- if(PC)
- PC.seed = S.seed
- else if(S.seed.spread == 2)
+ if(S.seed.spread == 2)
msg_admin_attack("[key_name(user)] has planted a spreading vine packet.")
var/obj/effect/plant_controller/PC = new(get_turf(src))
if(PC)
diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index 33e6f47c574..490481fdd15 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -113,6 +113,70 @@ proc/populate_seed_list()
var/flower_icon = "vine_fruit" // Which overlay to use.
var/flower_colour // Which colour to use.
+ // 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/explosive // When thrown, acts as a grenade.
+ var/teleporting // Uses the bluespace tomato effect.
+ var/splat_type = /obj/effect/decal/cleanable/tomato_smudge
+
+//Applies an effect to a target atom.
+/datum/seed/proc/thrown_at(var/obj/item/thrown,var/atom/target)
+
+ var/splatted
+
+ if(istype(target,/mob/living))
+ splatted = apply_special_effect(target,thrown)
+ else if(istype(target,/turf))
+ splatted = 1
+ for(var/mob/living/M in target,thrown)
+ 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))
+ thrown.reagents.reaction(hit_atom)
+
+ new splat_type (get_turf(thrown))
+ thrown.visible_message("The [thrown.name] splatters against [target]!")
+ del(thrown)
+
+/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.
+
+ // Bluespace tomato code copied over from grown.dm.
+ if(teleporting)
+
+ //Plant potency determines radius of teleport.
+ var/outer_teleport_radius = potency/10
+ var/inner_teleport_radius = potency/15
+
+ var/list/turfs
+ if(inner_teleport_radius > 0)
+ turfs = orange(target,outer_teleport_radius) - orange(target,inner_teleport_radius)
+
+ if(!turfs.len)
+ target.visible_message("The [thrown.name] has been squashed.","You hear a smack.")
+ del(thrown)
+ return
+
+ // 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
+
+ return impact
+
//Creates a random seed. MAKE SURE THE LINE HAS DIVERGED BEFORE THIS IS CALLED.
/datum/seed/proc/randomize()
@@ -598,7 +662,14 @@ proc/populate_seed_list()
currently_querying = list()
for(var/i = 0;i 1 && potency > 0)
+ rtotal += round(potency/reagent_data[2])
+ reagents.add_reagent(rid,max(1,rtotal))
+
+ if(reagents.total_volume > 0)
+ bitesize = 1+round(reagents.total_volume / 2, 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(var/mob/living/M)
+ if(seed && seed.juicy)
+ if(istype(M))
+
+ if(M.buckled)
return
- potency = S.potency
+ if(istype(M,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(H.shoes && H.shoes.flags & NOSLIP)
+ return
- for(var/rid in S.chems)
- var/list/reagent_data = S.chems[rid]
- var/rtotal = reagent_data[1]
- if(reagent_data.len > 1 && potency > 0)
- rtotal += round(potency/reagent_data[2])
- reagents.add_reagent(rid,max(1,rtotal))
+ M.stop_pulling()
+ M << "\blue You slipped on the [name]!"
+ playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
+ M.Stun(8)
+ M.Weaken(5)
- if(reagents.total_volume > 0)
- bitesize = 1+round(reagents.total_volume / 2, 1)
+/obj/item/weapon/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom)
+ ..()
+ if(!seed)
+ return
+ seed.thrown_at(src,hit_atom)
+
+/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
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/attack_self(mob/user as mob)
+
+ if(!seed || !seed.spread != 1)
+ return
+
+ if(istype(user.loc,/turf/space))
+ return
+
+ // TODO: Generalize.
+ var/obj/effect/glowshroom/planted = new /obj/effect/glowshroom(user.loc)
+ planted.delay = 50
+ planted.endurance = 100
+ planted.potency = potency
+
+ user << "You plant the [src.name]."
+ del(src)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/pickup(mob/user)
+ if(seed && seed.biolum)
+ user.SetLuminosity(user.luminosity + seed.biolum)
+ SetLuminosity(0)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/dropped(mob/user)
+ if(seed && seed.biolum)
+ user.SetLuminosity(user.luminosity - seed.biolum)
+ SetLuminosity(seed.biolum)
+
+// Food object defines follow.
/obj/item/weapon/reagent_containers/food/snacks/grown/corn
name = "ear of corn"
desc = "Needs some butter!"
@@ -82,18 +143,6 @@
filling_color = "#E6E8DA"
plantname = "potato"
-/obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = W
- if(C.use(5))
- user << "You add some cable to the potato 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
-
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes
name = "bunch of grapes"
desc = "Nutritious!"
@@ -139,62 +188,13 @@
filling_color = "#C4C4C4"
plantname = "plastic"
-/obj/item/weapon/reagent_containers/food/snacks/grown/shand
- name = "S'rendarr's Hand leaf"
- desc = "A leaf sample from a lowland thicket shrub. Smells strongly like wax."
- icon_state = "shand"
- filling_color = "#70C470"
- plantname = "shand"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/mtear
- name = "sprig of Messa's Tear"
- desc = "A mountain climate herb with a soft, cold blue flower, known to contain an abundance of healing chemicals."
- icon_state = "mtear"
- filling_color = "#70C470"
- plantname = "mtear"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/mtear/attack_self(mob/user as mob)
- if(istype(user.loc,/turf/space))
- return
- var/obj/item/stack/medical/ointment/tajaran/poultice = new /obj/item/stack/medical/ointment/tajaran(user.loc)
-
- poultice.heal_burn = potency
- del(src)
-
- user << "You mash the petals into a poultice."
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/shand/attack_self(mob/user as mob)
- if(istype(user.loc,/turf/space))
- return
- var/obj/item/stack/medical/bruise_pack/tajaran/poultice = new /obj/item/stack/medical/bruise_pack/tajaran(user.loc)
-
- poultice.heal_brute = potency
- del(src)
-
- user << "You mash the leaves into a poultice."
-
/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries
name = "bunch of glow-berries"
desc = "Nutritious!"
- var/light_on = 1
- var/brightness_on = 2 //luminosity when on
filling_color = "#D3FF9E"
icon_state = "glowberrypile"
plantname = "glowberries"
-/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/Del()
- if(istype(loc,/mob))
- loc.SetLuminosity(round(loc.luminosity - potency/5,1))
- ..()
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/pickup(mob/user)
- src.SetLuminosity(0)
- user.SetLuminosity(round(user.luminosity + (potency/5),1))
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/dropped(mob/user)
- user.SetLuminosity(round(user.luminosity - (potency/5),1))
- src.SetLuminosity(round(potency/5,1))
-
/obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod
name = "cocoa pod"
desc = "Can be ground into cocoa powder."
@@ -279,22 +279,6 @@
slices_num = 5
plantname = "watermelon"
-/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin
- name = "pumpkin"
- desc = "It's large and scary."
- icon_state = "pumpkin"
- potency = 10
- filling_color = "#FAB728"
- plantname = "pumpkin"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/twohanded/fireaxe) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/melee/energy))
- user.show_message("You carve a face into [src]!", 1)
- new /obj/item/clothing/head/pumpkinhead (user.loc)
- del(src)
- return
-
/obj/item/weapon/reagent_containers/food/snacks/grown/lime
name = "lime"
desc = "It's so sour, your face will twist."
@@ -313,7 +297,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/orange
name = "orange"
- desc = "It's a tangy fruit."
+ desc = "It's an tangy fruit."
icon_state = "orange"
potency = 20
filling_color = "#FAAD28"
@@ -367,30 +351,6 @@
potency = 10
plantname = "tomato"
-/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/throw_impact(atom/hit_atom)
- ..()
- new/obj/effect/decal/cleanable/tomato_smudge(src.loc)
- src.visible_message("The [src.name] has been squashed.","You hear a smack.")
- del(src)
- return
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/killertomato
- name = "killer-tomato"
- desc = "I say to-mah-to, you say tom-mae-to... OH GOD IT'S EATING MY LEGS!!"
- icon_state = "killertomato"
- potency = 10
- filling_color = "#FF0000"
- potency = 30
- plantname = "killertomato"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/killertomato/attack_self(mob/user as mob)
- if(istype(user.loc,/turf/space))
- return
- new /mob/living/simple_animal/tomato(user.loc)
- del(src)
-
- user << "You plant the killer-tomato."
-
/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato
name = "blood-tomato"
desc = "So bloody...so...very...bloody....AHHHH!!!!"
@@ -399,16 +359,6 @@
filling_color = "#FF0000"
plantname = "bloodtomato"
-/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato/throw_impact(atom/hit_atom)
- ..()
- new/obj/effect/decal/cleanable/blood/splatter(src.loc)
- src.visible_message("The [src.name] has been squashed.","You hear a smack.")
- src.reagents.reaction(get_turf(hit_atom))
- for(var/atom/A in get_turf(hit_atom))
- src.reagents.reaction(A)
- del(src)
- return
-
/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato
name = "blue-tomato"
desc = "I say blue-mah-to, you say blue-mae-to."
@@ -417,21 +367,6 @@
filling_color = "#586CFC"
plantname = "bluetomato"
-/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/throw_impact(atom/hit_atom)
- ..()
- new/obj/effect/decal/cleanable/blood/oil(src.loc)
- src.visible_message("The [src.name] has been squashed.","You hear a smack.")
- src.reagents.reaction(get_turf(hit_atom))
- for(var/atom/A in get_turf(hit_atom))
- src.reagents.reaction(A)
- del(src)
- return
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/Crossed(AM as mob|obj)
- if (istype(AM, /mob/living))
- var/mob/living/M = AM
- M.slip("the [src]!")
-
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat
name = "wheat"
desc = "Sigh... wheat... a-grain?"
@@ -518,14 +453,6 @@
potency = 30
plantname = "walkingmushroom"
-/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user as mob)
- if(istype(user.loc,/turf/space))
- return
- new /mob/living/simple_animal/mushroom(user.loc)
- del(src)
-
- user << "You plant the walking mushroom."
-
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle
name = "chanterelle cluster"
desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!"
@@ -541,37 +468,6 @@
potency = 30
plantname = "glowshroom"
-/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user as mob)
- if(istype(user.loc,/turf/space))
- return
- var/obj/effect/glowshroom/planted = new /obj/effect/glowshroom(user.loc)
-
- planted.delay = 50
- planted.endurance = 100
- planted.potency = potency
- del(src)
-
- user << "You plant the glowshroom."
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/Del()
- if(istype(loc,/mob))
- loc.SetLuminosity(round(loc.luminosity - potency/10,1))
- ..()
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/pickup(mob/user)
- SetLuminosity(0)
- user.SetLuminosity(round(user.luminosity + (potency/10),1))
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/dropped(mob/user)
- user.SetLuminosity(round(user.luminosity - (potency/10),1))
- SetLuminosity(round(potency/10,1))
-
-
-// *************************************
-// Complex Grown Object Defines -
-// Putting these at the bottom so they don't clutter the list up. -Cheridan
-// *************************************
-
/obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato
name = "blue-space tomato"
desc = "So lubricated, you might slip through space-time."
@@ -581,52 +477,53 @@
filling_color = "#91F8FF"
plantname = "bluespacetomato"
-/obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato/throw_impact(atom/hit_atom)
- ..()
- var/mob/M = usr
- var/outer_teleport_radius = potency/10 //Plant potency determines radius of teleport.
- var/inner_teleport_radius = potency/15
- var/list/turfs = new/list()
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- if(inner_teleport_radius < 1) //Wasn't potent enough, it just splats.
- new/obj/effect/decal/cleanable/blood/oil(src.loc)
- src.visible_message("The [src.name] has been squashed.","You hear a smack.")
- del(src)
+// Super special snowflake grown items below.
+/obj/item/weapon/reagent_containers/food/snacks/grown/shand
+ name = "S'rendarr's Hand leaf"
+ desc = "A leaf sample from a lowland thicket shrub. Smells strongly like wax."
+ icon_state = "shand"
+ filling_color = "#70C470"
+ plantname = "shand"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mtear
+ name = "sprig of Messa's Tear"
+ desc = "A mountain climate herb with a soft, cold blue flower, known to contain an abundance of healing chemicals."
+ icon_state = "mtear"
+ filling_color = "#70C470"
+ plantname = "mtear"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mtear/attack_self(mob/user as mob)
+ if(istype(user.loc,/turf/space))
return
- for(var/turf/T in orange(M,outer_teleport_radius))
- if(T in orange(M,inner_teleport_radius)) continue
- if(istype(T,/turf/space)) continue
- if(T.density) continue
- if(T.x>world.maxx-outer_teleport_radius || T.xworld.maxy-outer_teleport_radius || T.yThe [src.name] has been squashed, causing a distortion in space-time.","You hear a splat and a crackle.")
+ var/obj/item/stack/medical/ointment/tajaran/poultice = new /obj/item/stack/medical/ointment/tajaran(user.loc)
+
+ poultice.heal_burn = potency
del(src)
- return
\ No newline at end of file
+
+ user << "You mash the petals into a poultice."
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/shand/attack_self(mob/user as mob)
+ if(istype(user.loc,/turf/space))
+ return
+ var/obj/item/stack/medical/bruise_pack/tajaran/poultice = new /obj/item/stack/medical/bruise_pack/tajaran(user.loc)
+
+ poultice.heal_brute = potency
+ del(src)
+
+ user << "You mash the leaves into a poultice."
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin
+ name = "pumpkin"
+ desc = "It's large and scary."
+ icon_state = "pumpkin"
+ potency = 10
+ filling_color = "#FAB728"
+ plantname = "pumpkin"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/twohanded/fireaxe) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/melee/energy))
+ user.show_message("You carve a face into [src]!", 1)
+ new /obj/item/clothing/head/pumpkinhead (user.loc)
+ del(src)
+ return
\ No newline at end of file