diff --git a/code/__DEFINES/botany.dm b/code/__DEFINES/botany.dm index 6ceafd88ef0..1ee833c6bf1 100644 --- a/code/__DEFINES/botany.dm +++ b/code/__DEFINES/botany.dm @@ -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. diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index d15e9664854..8fb4c974f1c 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -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 diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 3f2d31bca35..00d01c9732d 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -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.")) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 107598cbff7..0a5c7b71130 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -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. diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index fd84d079554..2f0f026110e 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -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 diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index 1691dbecfb1..8989d753a95 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -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