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