diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index c7314bf180..2a0b19a3a6 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -24,6 +24,7 @@ var/yield = 3 // Amount of growns created per harvest. If is -1, the plant/shroom/weed is never meant to be harvested. var/potency = 10 // The 'power' of a plant. Generally effects the amount of reagent in a plant, also used in other ways. var/growthstages = 6 // Amount of growth sprites the plant has. + var/instability = 5 //Chance that a plant will mutate in each stage of it's life. var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to CentCom. var/list/mutatelist = list() // The type of plants that this plant can mutate into. var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info. @@ -36,6 +37,7 @@ var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth var/weed_chance = 5 //Percentage chance per tray update to grow weeds + var/seed_flags = MUTATE_EARLY //Determines if a plant is allowed to mutate early at 30+ instability /obj/item/seeds/Initialize(mapload, nogenes = 0) . = ..() @@ -74,6 +76,10 @@ /obj/item/seeds/examine(mob/user) . = ..() . += "Use a pen on it to rename it or change its description." + if(reagents_add && user.can_see_reagents()) + . += "- Plant Reagents -" + for(var/datum/plant_gene/reagent/G in genes) + . += "- [G.get_name()] -" /obj/item/seeds/proc/Copy() var/obj/item/seeds/S = new type(null, 1) @@ -85,6 +91,7 @@ S.yield = yield S.potency = potency S.weed_rate = weed_rate + S.instability = instability S.weed_chance = weed_chance S.name = name S.plantname = plantname @@ -127,12 +134,14 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) adjust_production(rand(-productmut,productmut)) adjust_yield(rand(-yieldmut,yieldmut)) adjust_potency(rand(-potmut,potmut)) + adjust_instability(rand(-stabmut,stabmut)) adjust_weed_rate(rand(-wrmut, wrmut)) adjust_weed_chance(rand(-wcmut, wcmut)) if(prob(traitmut)) - add_random_traits(1, 1) - - + if(prob(50)) + add_random_traits(1, 1) + else + add_random_reagents(1, 1) /obj/item/seeds/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables. if(istype(Proj, /obj/item/projectile/energy/florayield)) @@ -170,8 +179,28 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) var/list/result = list() var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //needed for TK var/product_name - while(t_amount < getYield()) - var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src) + var/product_count = getYield() + while(t_amount < product_count) + var/obj/item/reagent_containers/food/snacks/grown/t_prod + if(instability >= 30 && (seed_flags & MUTATE_EARLY) && LAZYLEN(mutatelist) && prob(instability/3)) + var/obj/item/seeds/new_prod = pick(mutatelist) + t_prod = initial(new_prod.product) + if(!t_prod) + continue + t_prod = new t_prod(output_loc, src) + t_prod.seed = new new_prod + t_prod.seed.name = initial(new_prod.name) + t_prod.seed.desc = initial(new_prod.desc) + t_prod.seed.plantname = initial(new_prod.plantname) + t_prod.transform = initial(t_prod.transform) + t_prod.transform *= TRANSFORM_USING_VARIABLE(t_prod.seed.potency, 100) + 0.5 + t_amount++ + if(t_prod.seed) + //t_prod.seed = new new_prod + t_prod.seed.instability = round(instability * 0.5) + continue + else + t_prod = new product(output_loc, src) if(parent.myseed.plantname != initial(parent.myseed.plantname)) t_prod.name = lowertext(parent.myseed.plantname) if(productdesc) @@ -186,8 +215,8 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) product_name = parent.myseed.plantname if(getYield() >= 1) SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name) - parent.investigate_log("[user] harvested [getYield()] of [src], with seed traits [english_list(genes)] and reagents_add [english_list(reagents_add)] and potency [potency].", INVESTIGATE_BOTANY) parent.update_tray(user) + return result /obj/item/seeds/proc/harvest_userless() @@ -263,6 +292,14 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) if(C) C.value = production +/obj/item/seeds/proc/adjust_instability(adjustamt) + if(instability == -1) + return + instability = clamp(instability + adjustamt, 0, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/instability) + if(C) + C.value = instability + /obj/item/seeds/proc/adjust_potency(adjustamt) if(potency != -1) potency = clamp(potency + adjustamt, 0, 100) @@ -320,6 +357,14 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) if(C) C.value = potency +/obj/item/seeds/proc/set_instability(adjustamt) + if(instability == -1) + return + instability = clamp(adjustamt, 0, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/instability) + if(C) + C.value = instability + /obj/item/seeds/proc/set_weed_rate(adjustamt) weed_rate = clamp(adjustamt, 0, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) @@ -352,6 +397,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) text += "- Production speed: [production]\n" text += "- Endurance: [endurance]\n" text += "- Lifespan: [lifespan]\n" + text += "- Instability: [instability]\n" text += "- Weed Growth Rate: [weed_rate]\n" text += "- Weed Vulnerability: [weed_chance]\n" if(rarity) @@ -362,9 +408,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) continue all_traits += " [traits.get_name()]" text += "- Plant Traits:[all_traits]\n" - text += "*---------*" - return text /obj/item/seeds/proc/on_chem_reaction(datum/reagents/S) //in case seeds have some special interaction with special chems @@ -373,9 +417,19 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) /obj/item/seeds/attackby(obj/item/O, mob/user, params) if (istype(O, /obj/item/plant_analyzer)) to_chat(user, "*---------*\n This is \a [src].") - var/text = get_analyzer_text() - if(text) - to_chat(user, "[text]") + var/text + var/obj/item/plant_analyzer/P_analyzer = O + if(P_analyzer.scan_mode == PLANT_SCANMODE_STATS) + text = get_analyzer_text() + if(text) + to_chat(user, "[text]") + if(reagents_add && P_analyzer.scan_mode == PLANT_SCANMODE_CHEMICALS) + to_chat(user, "- Plant Reagents -") + to_chat(user, "*---------*") + for(var/datum/plant_gene/reagent/G in genes) + to_chat(user, "- [G.get_name()] -") + to_chat(user, "*---------*") + return diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 4a164e73d6..cb3b1472bb 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -34,7 +34,7 @@ temp_reagents.my_atom = H source.reagents.trans_to(temp_reagents, split) - H.applyChemicals(temp_reagents) + H.on_hydroponics_apply(temp_reagents) temp_reagents.clear_reagents() qdel(temp_reagents) diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm index 902276d73b..91ebb47e71 100644 --- a/code/modules/plumbing/plumbers/autohydro.dm +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -41,7 +41,7 @@ /obj/machinery/hydroponics/constructable/automagic/process() if(reagents) - applyChemicals(reagents) + on_hydroponics_apply(reagents) reagents.clear_reagents() if(dead) dead = 0