Delete seeds whenever a plant is deletes, delete plant genes when a seed is deleted, + refactor various gene adding / deleting (#61747)

This commit is contained in:
MrMelbert
2021-10-07 21:27:07 -05:00
committed by GitHub
parent 6c87b0665a
commit 270a53e117
13 changed files with 161 additions and 117 deletions

View File

@@ -1155,8 +1155,12 @@
#define COMSIG_PLANT_ON_SLIP "plant_on_slip"
///called when a plant with liquid contents is squashed on (atom/target)
#define COMSIG_PLANT_ON_SQUASH "plant_on_squash"
///called when a plant grows in a tray (obj/machinery/hydroponics)
#define COMSIG_PLANT_ON_GROW "plant_on_grow"
///called when a plant backfires via the backfire element (mob/victim)
#define COMSIG_PLANT_ON_BACKFIRE "plant_on_backfire"
///called when a seed grows in a tray (obj/machinery/hydroponics)
#define COMSIG_SEED_ON_GROW "plant_on_grow"
///called when a seed is planted in a tray (obj/machinery/hydroponics)
#define COMSIG_SEED_ON_PLANTED "plant_on_plant"
//Gibs

View File

@@ -7,14 +7,12 @@
id_arg_index = 2
/// Whether we stop the current action if backfire is triggered (EX: returning CANCEL_ATTACK_CHAIN)
var/cancel_action = FALSE
/// The callback of the backfire effect of the plant.
var/datum/callback/backfire_callback
/// Any extra traits we want to check in addition to TRAIT_PLANT_SAFE. Mobs with a trait in this list will be considered safe. List of traits.
var/extra_traits
/// Any plant genes we want to check that are required for our plant to be dangerous. Plants without a gene in this list will be considered safe. List of typepaths.
var/extra_genes
/datum/element/plant_backfire/Attach(datum/target, backfire_callback, cancel_action = FALSE, extra_traits, extra_genes)
/datum/element/plant_backfire/Attach(datum/target, cancel_action = FALSE, extra_traits, extra_genes)
. = ..()
if(!isitem(target))
return ELEMENT_INCOMPATIBLE
@@ -22,7 +20,6 @@
src.cancel_action = cancel_action
src.extra_traits = extra_traits
src.extra_genes = extra_genes
src.backfire_callback = backfire_callback
RegisterSignal(target, COMSIG_ITEM_PRE_ATTACK, .proc/attack_safety_check)
RegisterSignal(target, COMSIG_ITEM_PICKUP, .proc/pickup_safety_check)
@@ -43,7 +40,7 @@
if(plant_safety_check(source, user))
return
backfire_callback.Invoke(source, user)
SEND_SIGNAL(source, COMSIG_PLANT_ON_BACKFIRE, user)
if(cancel_action)
return COMPONENT_CANCEL_ATTACK_CHAIN
@@ -58,7 +55,7 @@
if(plant_safety_check(source, user))
return
backfire_callback.Invoke(source, user)
SEND_SIGNAL(source, COMSIG_PLANT_ON_BACKFIRE, user)
/*
* Checks before we throw the plant if we're okay to continue.
@@ -72,7 +69,7 @@
var/mob/living/thrower = arguments[4] // 4th arg = mob/thrower
if(plant_safety_check(source, thrower))
return
backfire_callback.Invoke(source, thrower)
SEND_SIGNAL(source, COMSIG_PLANT_ON_BACKFIRE, thrower)
if(cancel_action)
return COMPONENT_CANCEL_THROW

View File

@@ -68,7 +68,7 @@ GLOBAL_VAR_INIT(glowshrooms, 0)
/obj/structure/glowshroom/Initialize(mapload, obj/item/seeds/newseed)
. = ..()
GLOB.glowshrooms++
if(newseed)
if(istype(newseed))
myseed = newseed
myseed.forceMove(src)
else
@@ -76,12 +76,13 @@ GLOBAL_VAR_INIT(glowshrooms, 0)
modify_max_integrity(GLOWSHROOM_BASE_INTEGRITY + ((100 - GLOWSHROOM_BASE_INTEGRITY) / 100 * myseed.endurance)) //goes up to 100 with peak endurance
var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow)
if(ispath(G)) // Seeds were ported to initialize so their genes are still typepaths here, luckily their initializer is smart enough to handle us doing this
myseed.genes -= G
G = new G
myseed.genes += G
set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color)
var/datum/plant_gene/trait/glow/our_glow_gene = myseed.get_gene(/datum/plant_gene/trait/glow)
if(ispath(our_glow_gene)) // Seeds were ported to initialize so their genes are still typepaths here, luckily their initializer is smart enough to handle us doing this
myseed.genes -= our_glow_gene
our_glow_gene = new our_glow_gene
myseed.genes += our_glow_gene
if(istype(our_glow_gene))
set_light(our_glow_gene.glow_range(myseed), our_glow_gene.glow_power(myseed), our_glow_gene.glow_color)
setDir(calc_dir())
base_icon_state = initial(icon_state)
if(!floor)
@@ -104,9 +105,11 @@ GLOBAL_VAR_INIT(glowshrooms, 0)
START_PROCESSING(SSobj, src)
/obj/structure/glowshroom/Destroy()
. = ..()
if(isatom(myseed))
QDEL_NULL(myseed)
GLOB.glowshrooms--
STOP_PROCESSING(SSobj, src)
return ..()
/**
* Causes glowshroom spreading across the floor/walls.
@@ -219,7 +222,9 @@ GLOBAL_VAR_INIT(glowshrooms, 0)
/obj/structure/glowshroom/proc/Decay(amount)
myseed.adjust_endurance(-amount * endurance_decay_rate)
take_damage(amount)
if (myseed.endurance <= MIN_PLANT_ENDURANCE) // Plant is gone
// take_damage could qdel our shroom, so check beforehand
// if our endurance dropped before the min plant endurance, then delete our shroom anyways
if (!QDELETED(src) && myseed.endurance <= MIN_PLANT_ENDURANCE)
qdel(src)
/obj/structure/glowshroom/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)

View File

@@ -44,7 +44,7 @@
if(!tastes)
tastes = list("[name]" = 1) //This happens first else the component already inits
if(new_seed)
if(istype(new_seed))
seed = new_seed.Copy()
else if(ispath(seed))
@@ -74,6 +74,11 @@
seed.prepare_result(src)
transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5 //Makes the resulting produce's sprite larger or smaller based on potency!
/obj/item/food/grown/Destroy()
if(isatom(seed))
QDEL_NULL(seed)
return ..()
/obj/item/food/grown/MakeEdible()
AddComponent(/datum/component/edible,\
initial_reagents = food_reagents,\

View File

@@ -32,8 +32,8 @@
. = ..()
var/obj/item/grown/bananapeel/peel = .
if(istype(peel))
peel.grind_results = list(/datum/reagent/medicine/coagulant/banana_peel = seed.potency * 0.2)
peel.juice_results = list(/datum/reagent/medicine/coagulant/banana_peel = seed.potency * 0.2)
peel.grind_results = list(/datum/reagent/medicine/coagulant/banana_peel = peel.seed.potency * 0.2)
peel.juice_results = list(/datum/reagent/medicine/coagulant/banana_peel = peel.seed.potency * 0.2)
/obj/item/food/grown/banana/suicide_act(mob/user)
user.visible_message(span_suicide("[user] is aiming [src] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!"))

View File

@@ -205,17 +205,12 @@
endurance = 8
yield = 4
growthstages = 2
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/reagent/liquidelectricity, /datum/plant_gene/trait/carnivory)
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/reagent/liquidelectricity, /datum/plant_gene/trait/carnivory/jupitercup)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
reagents_add = list(/datum/reagent/consumable/nutriment = 0.1)
mutatelist = null
graft_gene = /datum/plant_gene/trait/carnivory
/obj/item/seeds/chanter/jupitercup/Initialize(mapload,nogenes)
. = ..()
if(!nogenes)
unset_mutability(/datum/plant_gene/trait/carnivory, PLANT_GENE_REMOVABLE)
/obj/item/food/grown/mushroom/jupitercup
seed = /obj/item/seeds/chanter/jupitercup
name = "jupiter cup"
@@ -272,6 +267,7 @@
return FALSE
new effect_path(user.loc, seed)
to_chat(user, span_notice("You plant [src]."))
seed = null // We pass our seed to our planted shroom, null it here
qdel(src)
return TRUE

View File

@@ -60,16 +60,11 @@
instability = 35
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/invasive)
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/invasive/galaxythistle)
mutatelist = null
reagents_add = list(/datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/silibinin = 0.1)
graft_gene = /datum/plant_gene/trait/invasive
/obj/item/seeds/galaxythistle/Initialize(mapload,nogenes)
. = ..()
if(!nogenes)
unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE)
/obj/item/food/grown/galaxythistle
seed = /obj/item/seeds/galaxythistle
name = "galaxythistle flower head"

View File

@@ -13,8 +13,9 @@
. = ..()
create_reagents(100)
if(new_seed)
if(istype(new_seed))
seed = new_seed.Copy()
else if(ispath(seed))
// This is for adminspawn or map-placed growns. They get the default stats of their seed type.
seed = new seed()
@@ -33,6 +34,11 @@
transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5
add_juice()
/obj/item/grown/Destroy()
if(isatom(seed))
QDEL_NULL(seed)
return ..()
/obj/item/grown/proc/add_juice()
if(reagents)
return TRUE

View File

@@ -296,7 +296,7 @@
update_appearance()
if(myseed)
SEND_SIGNAL(myseed, COMSIG_PLANT_ON_GROW, src)
SEND_SIGNAL(myseed, COMSIG_SEED_ON_GROW, src)
return
@@ -580,6 +580,7 @@
investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)].", INVESTIGATE_BOTANY)
if(!user.transferItemToLoc(O, src))
return
SEND_SIGNAL(O, COMSIG_SEED_ON_PLANTED, src)
to_chat(user, span_notice("You plant [O]."))
dead = FALSE
myseed = O
@@ -651,6 +652,7 @@
for(var/datum/plant_gene/gene in myseed.genes)
if(gene.name == removed_trait)
if(myseed.genes.Remove(gene))
gene.on_removed(myseed)
qdel(gene)
break
myseed.reagents_from_genes()

View File

@@ -29,6 +29,23 @@
new_gene.mutability_flags = mutability_flags
return new_gene
/*
* on_new_seed is called when seed genes are initialized on the /obj/seed.
*
* new_seed - the seed being created
*/
/datum/plant_gene/proc/on_new_seed(obj/item/seeds/new_seed)
return // Not implemented
/*
* on_removed is called when the gene is removed from a seed.
* Also called when a seed is qdel'd (and all the genes are removed and deleted).
*
* old_seed - our seed, before being removed
*/
/datum/plant_gene/proc/on_removed(obj/item/seeds/old_seed)
return // Not implemented
/// Reagent genes store a reagent ID and reagent ratio.
/datum/plant_gene/reagent
name = "Nutriment"
@@ -94,24 +111,6 @@
return TRUE
return FALSE
/datum/plant_gene/reagent/polypyr
name = "Polypyrylium Oligomers"
reagent_id = /datum/reagent/medicine/polypyr
rate = 0.15
mutability_flags = PLANT_GENE_GRAFTABLE
/datum/plant_gene/reagent/liquidelectricity
name = "Enriched Liquid Electricity"
reagent_id = /datum/reagent/consumable/liquidelectricity/enriched
rate = 0.1
mutability_flags = PLANT_GENE_GRAFTABLE
/datum/plant_gene/reagent/carbon
name = "Carbon"
reagent_id = /datum/reagent/carbon
rate = 0.1
mutability_flags = PLANT_GENE_GRAFTABLE
/// Traits that affect the grown product.
/datum/plant_gene/trait
/// The rate at which this trait affects something. This can be anything really - why? I dunno.
@@ -182,14 +181,6 @@
return TRUE
/*
* on_new_seed is called when seed genes are initialized on the /obj/seed.
*
* new_seed - the seed being created
*/
/datum/plant_gene/trait/proc/on_new_seed(obj/item/seeds/new_seed)
return TRUE
/// 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
@@ -649,6 +640,10 @@
if(!(new_seed.resistance_flags & FIRE_PROOF))
new_seed.resistance_flags |= FIRE_PROOF
/datum/plant_gene/trait/fire_resistance/on_removed(obj/item/seeds/old_seed)
if(old_seed.resistance_flags & FIRE_PROOF)
old_seed.resistance_flags &= ~FIRE_PROOF
/datum/plant_gene/trait/fire_resistance/on_new_plant(obj/item/our_plant, newloc)
. = ..()
if(!.)
@@ -663,13 +658,11 @@
mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE
/datum/plant_gene/trait/invasive/on_new_seed(obj/item/seeds/new_seed)
. = ..()
if(!.)
return FALSE
RegisterSignal(new_seed, COMSIG_SEED_ON_GROW, .proc/try_spread)
RegisterSignal(new_seed, COMSIG_PLANT_ON_GROW, .proc/try_spread)
/datum/plant_gene/trait/invasive/on_removed(obj/item/seeds/old_seed)
UnregisterSignal(old_seed, COMSIG_SEED_ON_GROW)
return TRUE
/*
* Attempt to find an adjacent tray we can spread to.
*
@@ -850,6 +843,9 @@
if(istype(grown_plant))
grown_plant.preserved_food = TRUE
/datum/plant_gene/trait/carnivory
name = "Obligate Carnivory"
/// Plant type traits. Incompatible with one another.
/datum/plant_gene/trait/plant_type
name = "you shouldn't see this"

View File

@@ -44,7 +44,7 @@
var/rarity = 0
/// The type of plants that this plant can mutate into.
var/list/mutatelist
/// Plant genes are stored here, see plant_genes.dm for more info.
/// Starts as a list of paths, is converted to a list of types on init. Plant gene datums are stored here, see plant_genes.dm for more info.
var/list/genes = list()
/// A list of reagents to add to product.
var/list/reagents_add
@@ -90,14 +90,24 @@
genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id])
reagents_from_genes() //quality coding
/obj/item/seeds/Destroy()
// No AS ANYTHING here, because the list/genes could have typepaths in it.
for(var/datum/plant_gene/gene in genes)
gene.on_removed(src)
qdel(gene)
genes.Cut()
return ..()
/obj/item/seeds/examine(mob/user)
. = ..()
. += span_notice("Use a pen on it to rename it or change its description.")
if(reagents_add && user.can_see_reagents())
. += span_notice("- Plant Reagents -")
for(var/datum/plant_gene/reagent/G in genes)
. += span_notice("- [G.get_name()] -")
for(var/datum/plant_gene/reagent/reagent_gene in genes)
. += span_notice("- [reagent_gene.get_name()] -")
/// Copy all the variables from one seed to a new instance of the same seed and return it.
/obj/item/seeds/proc/Copy()
var/obj/item/seeds/copy_seed = new type(null, TRUE)
// Copy all the stats
@@ -115,10 +125,10 @@
copy_seed.desc = desc
copy_seed.productdesc = productdesc
copy_seed.genes = list()
for(var/datum/plant_gene/plant_genes in genes)
copy_seed.genes += plant_genes.Copy()
for(var/datum/plant_gene/trait/traits in genes)
traits.on_new_seed(copy_seed)
for(var/datum/plant_gene/gene in genes)
var/datum/plant_gene/copied_gene = gene.Copy()
copy_seed.genes += copied_gene
copied_gene.on_new_seed(copy_seed)
copy_seed.reagents_add = reagents_add.Copy() // Faster than grabbing the list from genes.
return copy_seed
@@ -131,18 +141,6 @@
for(var/datum/plant_gene/reagent/R in genes)
reagents_add[R.reagent_id] = R.rate
///This proc adds a mutability_flag to a gene
/obj/item/seeds/proc/set_mutability(typepath, mutability)
var/datum/plant_gene/g = get_gene(typepath)
if(g)
g.mutability_flags |= mutability
///This proc removes a mutability_flag from a gene
/obj/item/seeds/proc/unset_mutability(typepath, mutability)
var/datum/plant_gene/g = get_gene(typepath)
if(g)
g.mutability_flags &= ~mutability
/obj/item/seeds/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0, stabmut = 3)
adjust_lifespan(rand(-lifemut,lifemut))
adjust_endurance(rand(-endmut,endmut))

View File

@@ -154,7 +154,8 @@
if(!.)
return
our_plant.AddElement(/datum/element/plant_backfire, CALLBACK(src, .proc/backfire_effect), cancel_action_on_backfire, traits_to_check, genes_to_check)
our_plant.AddElement(/datum/element/plant_backfire, cancel_action_on_backfire, traits_to_check, genes_to_check)
RegisterSignal(our_plant, COMSIG_PLANT_ON_BACKFIRE, .proc/backfire_effect)
/*
* The backfire effect. Override with plant-specific effects.
@@ -228,16 +229,17 @@
name = "Active Capsicum Glands"
genes_to_check = list(/datum/plant_gene/trait/chem_heating)
/// The mob currently holding the chili.
var/mob/living/carbon/human/held_mob
var/datum/weakref/held_mob
/// The chili this gene is tied to, to track it for processing.
var/obj/item/our_chili
var/datum/weakref/our_chili
/datum/plant_gene/trait/backfire/chili_heat/on_new_plant(obj/item/our_plant, newloc)
. = ..()
if(!.)
return
RegisterSignal(our_plant, list(COMSIG_PARENT_PREQDELETED, COMSIG_ITEM_DROPPED), .proc/stop_backfire_effect)
our_chili = WEAKREF(our_plant)
RegisterSignal(our_plant, list(COMSIG_PARENT_QDELETING, COMSIG_ITEM_DROPPED), .proc/stop_backfire_effect)
/*
* Begin processing the trait on backfire.
@@ -248,8 +250,7 @@
/datum/plant_gene/trait/backfire/chili_heat/backfire_effect(obj/item/our_plant, mob/living/carbon/user)
. = ..()
held_mob = user
our_chili = our_plant
held_mob = WEAKREF(user)
START_PROCESSING(SSobj, src)
/*
@@ -261,7 +262,6 @@
SIGNAL_HANDLER
held_mob = null
our_chili = null
STOP_PROCESSING(SSobj, src)
/*
@@ -269,12 +269,17 @@
* Stops processing if we're no longer being held by [held mob].
*/
/datum/plant_gene/trait/backfire/chili_heat/process(delta_time)
if(held_mob.is_holding(our_chili))
held_mob.adjust_bodytemperature(7.5 * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time)
if(DT_PROB(5, delta_time))
to_chat(held_mob, "<span class='warning'>Your hand holding [our_chili] burns!</span>")
else
var/mob/living/carbon/our_mob = held_mob?.resolve()
var/obj/item/our_plant = our_chili?.resolve()
// If our weakrefs don't resolve, or if our mob is not holding our plant, stop processing.
if(!our_mob || !our_plant || !our_mob.is_holding(our_plant))
stop_backfire_effect()
return
our_mob.adjust_bodytemperature(7.5 * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time)
if(DT_PROB(5, delta_time))
to_chat(our_mob, span_warning("Your hand holding [our_plant] burns!"))
/// Bluespace Tomato squashing on the user on backfire
/datum/plant_gene/trait/backfire/bluespace
@@ -312,7 +317,8 @@
return
if(dangerous)
our_plant.AddElement(/datum/element/plant_backfire, CALLBACK(src, .proc/early_awakening), TRUE)
our_plant.AddElement(/datum/element/plant_backfire, TRUE)
RegisterSignal(our_plant, COMSIG_PLANT_ON_BACKFIRE, .proc/early_awakening)
RegisterSignal(our_plant, COMSIG_ITEM_ATTACK_SELF, .proc/manual_awakening)
RegisterSignal(our_plant, COMSIG_ITEM_PRE_ATTACK, .proc/pre_consumption_check)
@@ -561,17 +567,30 @@
/datum/plant_gene/trait/gas_production
name = "Miasma Gas Production"
/// The location of our tray, if we have one.
var/obj/machinery/hydroponics/home_tray
var/datum/weakref/home_tray
/// The seed emitting gas.
var/obj/item/seeds/stinky_seed
var/datum/weakref/stinky_seed
/datum/plant_gene/trait/gas_production/on_new_seed(obj/item/seeds/new_seed)
. = ..()
if(!.)
return
RegisterSignal(new_seed, COMSIG_SEED_ON_PLANTED, .proc/set_home_tray)
RegisterSignal(new_seed, COMSIG_SEED_ON_GROW, .proc/try_release_gas)
RegisterSignal(new_seed, COMSIG_PARENT_QDELETING, .proc/stop_gas)
stinky_seed = WEAKREF(new_seed)
RegisterSignal(new_seed, COMSIG_PLANT_ON_GROW, .proc/try_release_gas)
RegisterSignal(new_seed, COMSIG_PARENT_PREQDELETED, .proc/stop_gas)
/datum/plant_gene/trait/gas_production/on_removed(obj/item/seeds/old_seed)
UnregisterSignal(old_seed, list(COMSIG_PARENT_QDELETING, COMSIG_SEED_ON_PLANTED, COMSIG_SEED_ON_GROW))
stop_gas()
/*
* Whenever we're planted, set a new home tray.
*
* our_seed - the seed growing
* grown_tray - the tray we were planted in
*/
/datum/plant_gene/trait/gas_production/proc/set_home_tray(obj/item/seeds/our_seed, obj/machinery/hydroponics/grown_tray)
SIGNAL_HANDLER
home_tray = WEAKREF(grown_tray)
/*
* Whenever the plant starts to grow in a tray, check if we can release gas.
@@ -585,8 +604,6 @@
if(grown_tray.age < our_seed.maturation) // Start a little before it blooms
return
stinky_seed = our_seed
home_tray = grown_tray
START_PROCESSING(SSobj, src)
/*
@@ -595,28 +612,52 @@
/datum/plant_gene/trait/gas_production/proc/stop_gas(datum/source)
SIGNAL_HANDLER
stinky_seed = null
home_tray = null
STOP_PROCESSING(SSobj, src)
/*
* If the conditions are acceptable and the potency is high enough, release miasma into the air.
*/
/datum/plant_gene/trait/gas_production/process(delta_time)
if(!stinky_seed || !home_tray || stinky_seed.loc != home_tray)
var/obj/item/seeds/seed = stinky_seed?.resolve()
var/obj/machinery/hydroponics/tray = home_tray?.resolve()
// If our weakrefs don't resolve, or if our seed is /somehow/ not in the tray it was planted in, stop processing.
if(!seed || !tray || seed.loc != tray)
stop_gas()
return
var/turf/open/tray_turf = get_turf(home_tray)
if(abs(ONE_ATMOSPHERE - tray_turf.return_air().return_pressure()) > (stinky_seed.potency / 10 + 10)) // clouds can begin showing at around 50-60 potency in standard atmos
var/turf/open/tray_turf = get_turf(tray)
if(abs(ONE_ATMOSPHERE - tray_turf.return_air().return_pressure()) > (seed.potency / 10 + 10)) // clouds can begin showing at around 50-60 potency in standard atmos
return
var/datum/gas_mixture/stank = new
ADD_GAS(/datum/gas/miasma, stank.gases)
stank.gases[/datum/gas/miasma][MOLES] = (stinky_seed.yield + 6) * 3.5 * MIASMA_CORPSE_MOLES * delta_time // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses
stank.gases[/datum/gas/miasma][MOLES] = (seed.yield + 6) * 3.5 * MIASMA_CORPSE_MOLES * delta_time // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses
stank.temperature = T20C // without this the room would eventually freeze and miasma mining would be easier
tray_turf.assume_air(stank)
/// Plant doesn't get annoyed by pests in their tray.
/datum/plant_gene/trait/carnivory
name = "Obligate Carnivory"
/// Starthistle's essential invasive spreading
/datum/plant_gene/trait/invasive/galaxythistle
mutability_flags = PLANT_GENE_GRAFTABLE
/// Jupitercup's essential carnivory
/datum/plant_gene/trait/carnivory/jupitercup
mutability_flags = PLANT_GENE_GRAFTABLE
/// Spaceman's Trumpet fragile Polypyrylium Oligomers
/datum/plant_gene/reagent/polypyr
reagent_id = /datum/reagent/medicine/polypyr
rate = 0.15
mutability_flags = PLANT_GENE_GRAFTABLE
/// Jupitercup's fragile Liquid Electricity
/datum/plant_gene/reagent/liquidelectricity
reagent_id = /datum/reagent/consumable/liquidelectricity/enriched
rate = 0.1
mutability_flags = PLANT_GENE_GRAFTABLE
/// Carbon Roses's fragile Carbon
/datum/plant_gene/reagent/carbon
reagent_id = /datum/reagent/carbon
rate = 0.1
mutability_flags = PLANT_GENE_GRAFTABLE

View File

@@ -251,7 +251,6 @@
growthstages = 3
rarity = 20
reagents_add = list(/datum/reagent/consumable/nutriment = 0.1)
resistance_flags = FIRE_PROOF
species = "polypore" // silence unit test
genes = list(/datum/plant_gene/trait/fire_resistance)
graft_gene = /datum/plant_gene/trait/fire_resistance