Fix poppy plant interaction breaking spades (#92960)

## About The Pull Request

This unassuming line was added in the middle of tray attackby to allow
for sharp objects to extract poppy sap


71c49cb4d1/code/modules/hydroponics/hydroponics.dm (L941-L945)

Unfortunately, spades are sharp, and the shovel interaction followed
lower in the chain. This also isn't proper use of `interact_with_atom`
so we can fix two birds with one stone here.

Now, poppy seeds hook the `COMSIG_ATOM_ITEM_INTERACTION` signal on the
tray when planted, so we can run snowflake checks on the seed itself.

## Changelog

🆑 Melbert
fix: Spades work on trays again
qol: Poppy seeds now give better feedback when unable to harvest
qol: Poppy seeds now have an immutable gene indicating they can be
sliced for sap
del: Lilys and Geraniums can no longer be tapped for sap
/🆑
This commit is contained in:
MrMelbert
2025-09-15 18:39:08 -05:00
committed by GitHub
parent 8a4613b980
commit 2bcafecefb
6 changed files with 89 additions and 30 deletions

View File

@@ -53,6 +53,8 @@
#define TRAIT_HALVES_YIELD (1<<0)
/// Doesn't get bonuses from tray yieldmod
#define TRAIT_NO_POLLINATION (1<<1)
/// Shows description on examine
#define TRAIT_SHOW_EXAMINE (1<<2)
/// -- Trait IDs. Plants that match IDs cannot be added to the same plant. --
/// Plants that glow.

View File

@@ -15,23 +15,10 @@
growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi'
icon_grow = "poppy-grow"
icon_dead = "poppy-dead"
genes = list(/datum/plant_gene/trait/preserved)
genes = list(/datum/plant_gene/trait/preserved, /datum/plant_gene/trait/opium_production)
mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/poppy/lily)
reagents_add = list(/datum/reagent/medicine/c2/libital = 0.2, /datum/reagent/consumable/nutriment = 0.05)
/obj/item/seeds/poppy/interact_with_atom(obj/item/I, mob/user, obj/machinery/hydroponics/tray)
if(I.sharpness && !src.extracted && tray.age >= 10 && tray.age <= 19)
src.extracted = TRUE
var/seed_yield = tray.myseed?.potency
new /obj/item/food/drug/opium/raw(get_turf(src), seed_yield)
playsound(src, 'sound/effects/bubbles/bubbles.ogg', 30, TRUE)
playsound(loc, 'sound/items/weapons/bladeslice.ogg', 30, TRUE)
user.visible_message(
span_notice("You carefully slice the poppy's pod, collecting the fragrant, alluring sap.")
)
return ITEM_INTERACT_SUCCESS
return NONE
/obj/item/food/grown/poppy
seed = /obj/item/seeds/poppy
name = "poppy"
@@ -55,6 +42,7 @@
growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi'
icon_grow = "lily-grow"
icon_dead = "lily-dead"
genes = list(/datum/plant_gene/trait/preserved)
mutatelist = list(/obj/item/seeds/poppy/lily/trumpet)
/obj/item/food/grown/poppy/lily
@@ -84,7 +72,7 @@
icon_grow = "spacemanstrumpet-grow"
icon_dead = "spacemanstrumpet-dead"
mutatelist = null
genes = list(/datum/plant_gene/reagent/preset/polypyr, /datum/plant_gene/trait/preserved)
genes = list(/datum/plant_gene/trait/preserved, /datum/plant_gene/reagent/preset/polypyr)
reagents_add = list(/datum/reagent/consumable/nutriment = 0.05)
rarity = 30
graft_gene = /datum/plant_gene/reagent/preset/polypyr
@@ -109,6 +97,7 @@
growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi'
icon_grow = "geranium-grow"
icon_dead = "geranium-dead"
genes = list(/datum/plant_gene/trait/preserved)
mutatelist = list(/obj/item/seeds/poppy/geranium/fraxinella)
/obj/item/food/grown/poppy/geranium

View File

@@ -529,19 +529,24 @@
///Sets a new value for the myseed variable, which is the seed of the plant that's growing inside the tray.
/obj/machinery/hydroponics/proc/set_seed(obj/item/seeds/new_seed, delete_old_seed = TRUE)
var/old_seed = myseed
var/obj/item/seeds/old_seed = myseed
myseed = new_seed
for(var/datum/plant_gene/trait/gene in old_seed?.genes)
gene.on_unplanted_from_tray(src, old_seed)
if(old_seed && delete_old_seed)
qdel(old_seed)
set_plant_status(new_seed ? HYDROTRAY_PLANT_GROWING : HYDROTRAY_NO_PLANT) //To make sure they can't just put in another seed and insta-harvest it
if(myseed && myseed.loc != src)
myseed.forceMove(src)
SEND_SIGNAL(src, COMSIG_HYDROTRAY_SET_SEED, new_seed)
for(var/datum/plant_gene/trait/gene in myseed?.genes)
gene.on_plant_in_tray(src, myseed)
age = 0
update_appearance()
if(isnull(myseed))
remove_shared_particles(/particles/pollen)
/*
* Setter proc to set a tray to a new self_sustaining state and update all values associated with it.
*
@@ -938,12 +943,6 @@
to_chat(user, span_warning("This plot is completely devoid of weeds! It doesn't need uprooting."))
return
else if(O.sharpness) // Allows for the extraction (for opium or sap) interaction if a seed has it.
if(myseed && !myseed.extracted)
myseed.interact_with_atom(O, user, src)
else
return ..()
else if(istype(O, /obj/item/secateurs))
if(!myseed)
to_chat(user, span_notice("This plot is empty."))

View File

@@ -123,7 +123,7 @@
/// Flag - Traits that share an ID cannot be placed on the same plant.
var/trait_ids
/// Flag - Modifications made to the final product.
var/trait_flags
var/trait_flags = TRAIT_SHOW_EXAMINE
/// A blacklist of seeds that a trait cannot be attached to.
var/list/obj/item/seeds/seed_blacklist
@@ -178,10 +178,29 @@
return FALSE
// Add on any bonus lines on examine
if(description)
if(description && (trait_flags & TRAIT_SHOW_EXAMINE))
RegisterSignal(our_plant, COMSIG_ATOM_EXAMINE, PROC_REF(examine))
return TRUE
/**
* on_plant_in_tray is called when a seed with this trait is placed in a hydroponics tray
*
* * tray - the hydroponics tray the seed is placed in
* * seed - the seed being placed in the tray
*/
/datum/plant_gene/trait/proc/on_plant_in_tray(obj/machinery/hydroponics/tray, obj/item/seeds/seed)
return
/**
* on_unplanted_from_tray is called when a seed with this trait is removed from a hydroponics tray
* (this can be done from being harvested, being uprooted, etc.)
*
* * tray - the hydroponics tray the seed is removed from
* * seed - the seed being removed from the tray
*/
/datum/plant_gene/trait/proc/on_unplanted_from_tray(obj/machinery/hydroponics/tray, obj/item/seeds/seed)
return
/// Add on any unique examine text to the plant's examine text.
/datum/plant_gene/trait/proc/examine(obj/item/our_plant, mob/examiner, list/examine_list)
SIGNAL_HANDLER
@@ -499,7 +518,7 @@
description = "The reagent volume is doubled, halving the plant yield instead."
icon = FA_ICON_FLASK_VIAL
rate = 2
trait_flags = TRAIT_HALVES_YIELD
trait_flags = TRAIT_SHOW_EXAMINE|TRAIT_HALVES_YIELD
mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE
/datum/plant_gene/trait/maxchem/on_new_plant(obj/item/our_plant, newloc)
@@ -895,7 +914,7 @@
description = "It consumes nutriments to heat up other reagents, halving the yield."
icon = FA_ICON_TEMPERATURE_ARROW_UP
trait_ids = TEMP_CHANGE_ID
trait_flags = TRAIT_HALVES_YIELD
trait_flags = TRAIT_SHOW_EXAMINE|TRAIT_HALVES_YIELD
mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE
/**
@@ -907,7 +926,7 @@
description = "It consumes nutriments to cool down other reagents, halving the yield."
icon = FA_ICON_TEMPERATURE_ARROW_DOWN
trait_ids = TEMP_CHANGE_ID
trait_flags = TRAIT_HALVES_YIELD
trait_flags = TRAIT_SHOW_EXAMINE|TRAIT_HALVES_YIELD
mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE
/// Prevents species mutation, while still allowing wild mutation harvest and Floral Somatoray species mutation. Trait acts as a tag for hydroponics.dm to recognise.

View File

@@ -64,8 +64,6 @@
var/graft_gene
///Determines if the plant should be allowed to mutate early at 30+ instability.
var/seed_flags = MUTATE_EARLY
///Determines if the plant has been sliced with a sharp tool to extract substances like saps.
var/extracted = 0
/obj/item/seeds/Initialize(mapload, nogenes = FALSE)
. = ..()
@@ -661,3 +659,11 @@
plant_overlay.icon_state = "[icon_grow][t_growthstate]"
plant_overlay.pixel_z = plant_icon_offset
return plant_overlay
/// Called when the seed is set in a tray
/obj/item/seeds/proc/on_planted(obj/machinery/hydroponics/parent)
return
/// Called when the seed is removed from a tray - possibly from being harvested, possibly from being uprooted
/obj/item/seeds/proc/on_unplanted(obj/machinery/hydroponics/parent)
return

View File

@@ -685,9 +685,53 @@
name = "Complex Harvest"
description = "Halves the maximum yield of the plant, and prevents it from benefiting from pollination's yield bonus."
icon = FA_ICON_SLASH
trait_flags = TRAIT_HALVES_YIELD|TRAIT_NO_POLLINATION
trait_flags = TRAIT_SHOW_EXAMINE|TRAIT_HALVES_YIELD|TRAIT_NO_POLLINATION
mutability_flags = NONE
/// Poppy's unique trait that allows slicing for sap
/datum/plant_gene/trait/opium_production
name = "Sap Buds"
description = "Using a knife or other sharp object on the plant between ages 200 seconds to 400 seconds will yield a sap."
trait_flags = NONE
icon = FA_ICON_PILLS
/// Has parent plant been harvested for sap already?
var/extracted = FALSE
/datum/plant_gene/trait/opium_production/on_plant_in_tray(obj/machinery/hydroponics/tray, obj/item/seeds/seed)
RegisterSignal(tray, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(try_extract))
extracted = FALSE // just in case...
/datum/plant_gene/trait/opium_production/on_unplanted_from_tray(obj/machinery/hydroponics/tray, obj/item/seeds/seed)
UnregisterSignal(tray, COMSIG_ATOM_ITEM_INTERACTION)
/// Redirect tray item interaction so we can have custom extracting behavior
/datum/plant_gene/trait/opium_production/proc/try_extract(obj/machinery/hydroponics/source, mob/living/user, obj/item/tool, ...)
SIGNAL_HANDLER
if(!tool.sharpness || tool.tool_behaviour == TOOL_SHOVEL)
return NONE
if(source.age < 10)
to_chat(user, span_warning("The [LOWER_TEXT(source.myseed.plantname)] are too young to extract sap from!"))
return ITEM_INTERACT_FAILURE
if(source.age > 19)
to_chat(user, span_warning("The [LOWER_TEXT(source.myseed.plantname)] are too old to extract sap from!"))
return ITEM_INTERACT_FAILURE
if(extracted)
to_chat(user, span_warning("The [LOWER_TEXT(source.myseed.plantname)] have already been harvested for sap!"))
return ITEM_INTERACT_FAILURE
extracted = TRUE
new /obj/item/food/drug/opium/raw(source.drop_location(), source.myseed.potency)
playsound(src, 'sound/effects/bubbles/bubbles.ogg', 30, TRUE)
playsound(tool, 'sound/items/weapons/bladeslice.ogg', 30, TRUE)
user.visible_message(
span_notice("[user] carefully slices open a [source.myseed.species] pod, extracting a sap."),
span_notice("You carefully slice the [source.myseed.species]'s pod, collecting the fragrant, alluring sap."),
visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE,
)
return ITEM_INTERACT_SUCCESS
/// Starthistle's essential invasive spreading
/datum/plant_gene/trait/invasive/galaxythistle
mutability_flags = PLANT_GENE_GRAFTABLE