diff --git a/code/__DEFINES/botany.dm b/code/__DEFINES/botany.dm new file mode 100644 index 0000000000..d2e4d4e739 --- /dev/null +++ b/code/__DEFINES/botany.dm @@ -0,0 +1,12 @@ + +#define TRAY_NAME_UPDATE name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name) +#define YIELD_WEED_MINIMUM 3 +#define YIELD_WEED_MAXIMUM 10 +#define STATIC_NUTRIENT_CAPACITY 10 + +//Both available scanning modes for the plant analyzer. +#define PLANT_SCANMODE_STATS 0 +#define PLANT_SCANMODE_CHEMICALS 1 + +//Seed flags. +#define MUTATE_EARLY (1<<0) diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index b8480a1901..a38a9237ca 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -22,6 +22,7 @@ endurance = 25 yield = 6 potency = 5 + instability = 30 icon_dead = "ambrosia-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/ambrosia/deus) diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 81318f8fe1..e825c88524 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -8,6 +8,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/banana lifespan = 50 endurance = 30 + instability = 10 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_dead = "banana-dead" genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest) diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index eba7a3d3c4..ca9e1f8a0e 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -10,6 +10,7 @@ maturation = 5 production = 5 yield = 2 + instability = 30 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_grow = "berry-grow" // Uses one growth icons set for all the subtypes icon_dead = "berry-dead" // Same for the dead icon diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index e4fe7fcdbc..1882d5fe97 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -9,6 +9,7 @@ maturation = 8 potency = 20 growthstages = 1 + instability = 40 growing_icon = 'goon/icons/obj/hydroponics.dmi' icon_grow = "cannabis-grow" // Uses one growth icons set for all the subtypes icon_dead = "cannabis-dead" // Same for the dead icon diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 1d1309acb8..9bfdb2979c 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -9,6 +9,7 @@ production = 1 yield = 4 potency = 15 + instability = 20 icon_dead = "wheat-dead" mutatelist = list(/obj/item/seeds/wheat/oat, /obj/item/seeds/wheat/meat) reagents_add = list(/datum/reagent/consumable/nutriment = 0.04) diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 001a90b441..2f8fb12724 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -11,6 +11,7 @@ production = 5 yield = 4 potency = 20 + instability = 30 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_grow = "chili-grow" // Uses one growth icons set for all the subtypes icon_dead = "chili-dead" // Same for the dead icon diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 9ac705aa83..5de0740b87 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -10,6 +10,7 @@ maturation = 5 production = 5 yield = 2 + instability = 20 growthstages = 5 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_grow = "cocoapod-grow" diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index ad09751e44..ae046c9ff3 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -8,6 +8,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/corn maturation = 8 potency = 20 + instability = 50 // Corn used to be wheatgrass, but through generations of selective cultivation... growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_grow = "corn-grow" // Uses one growth icons set for all the subtypes diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index a898b76ee8..beff751479 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -12,6 +12,7 @@ production = 1 yield = 2 potency = 50 + instability = 15 growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing.dmi' icon_dead = "cotton-dead" diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index a74850f3be..e6fd991169 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -11,6 +11,7 @@ maturation = 2 production = 5 yield = 5 + instability = 10 growthstages = 2 icon_grow = "grass-grow" icon_dead = "grass-dead" diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index 5f1fdcdaa9..73026e546a 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -11,6 +11,7 @@ lifespan = 20 endurance = 10 yield = 4 + instability = 55 growthstages = 4 rarity = 30 var/list/mutations = list() diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 940508f66b..b988261770 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -8,6 +8,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/watermelon lifespan = 50 endurance = 40 + instability = 20 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_dead = "watermelon-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -75,4 +76,4 @@ to_chat(user, "[src] rapidly turns into ash!") qdel(src) new /obj/effect/decal/cleanable/ash(drop_location()) -*/ \ No newline at end of file +*/ diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index fe60e9f397..59301732c6 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -11,6 +11,7 @@ production = 1 yield = 6 potency = 10 + instability = 35 growthstages = 3 grind_results = list(/datum/reagent/mustardgrind = 1) growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' @@ -111,6 +112,7 @@ maturation = 3 production = 5 yield = 4 + instability = 10 growthstages = 1 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -140,6 +142,7 @@ endurance = 50 maturation = 3 yield = 4 + instability = 15 growthstages = 2 reagents_add = list(/datum/reagent/consumable/sugar = 0.25) mutatelist = list(/obj/item/seeds/bamboo) @@ -534,4 +537,4 @@ /obj/item/reagent_containers/food/snacks/grown/aloe/microwave_act(obj/machinery/microwave/M) new /obj/item/stack/medical/aloe(drop_location(), 2) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 699a1c798d..80ba6b7375 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -18,6 +18,7 @@ production = 5 yield = 4 potency = 15 + instability = 30 growthstages = 4 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' @@ -43,6 +44,7 @@ maturation = 10 production = 5 yield = 4 + instability = 30 growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' @@ -187,6 +189,7 @@ production = 1 yield = 5 potency = 15 + instability = 20 growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' @@ -244,6 +247,7 @@ production = 1 yield = 3 //-> spread potency = 30 //-> brightness + instability = 20 growthstages = 4 rarity = 20 genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/plant_type/fungal_metabolism) @@ -334,4 +338,4 @@ /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom/attack_self(mob/user) . = ..() if(.) - investigate_log("was planted by [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY) \ No newline at end of file + investigate_log("was planted by [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY) diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index cee7748c59..e4aedfd4b0 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -8,6 +8,7 @@ lifespan = 30 endurance = 40 // tuff like a toiger yield = 4 + instability = 25 growthstages = 5 genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy) mutatelist = list(/obj/item/seeds/nettle/death) diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index a75b9caf5f..f6fcd3ae1b 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -10,6 +10,7 @@ production = 4 yield = 6 endurance = 25 + instability = 10 growthstages = 3 weed_chance = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm index 79d506cf56..0775f7c45d 100644 --- a/code/modules/hydroponics/grown/peas.dm +++ b/code/modules/hydroponics/grown/peas.dm @@ -8,6 +8,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/peas maturation = 3 potency = 25 + instability = 15 growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_grow = "peas-grow" @@ -79,6 +80,7 @@ potency = 75 yield = 1 production = 10 + instability = 45 //The world is a very unstable place. Constantly changing. growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_grow = "worldpeas-grow" diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index ac171b4e45..5f9b55b881 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -9,6 +9,7 @@ maturation = 10 production = 1 yield = 5 + instability = 15 growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' mutatelist = list(/obj/item/seeds/carrot/parsnip) @@ -69,6 +70,7 @@ lifespan = 60 endurance = 50 yield = 6 + instability = 10 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_dead = "whitebeet-dead" mutatelist = list(/obj/item/seeds/redbeet) diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 223b2c7bce..1c8055f821 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -79,6 +79,7 @@ maturation = 5 production = 5 yield = 5 + instability = 20 growthstages = 5 icon_dead = "coffee-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index d3525c951d..af7d192e00 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -6,6 +6,7 @@ species = "tomato" plantname = "Tomato Plants" product = /obj/item/reagent_containers/food/snacks/grown/tomato + instability = 25 maturation = 8 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_grow = "tomato-grow" diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index f6be9db9a2..b032b84a77 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -1,7 +1,7 @@ // Plant analyzer /obj/item/plant_analyzer name = "plant analyzer" - desc = "A scanner used to evaluate a plant's various areas of growth." + desc = "A scanner used to evaluate a plant's various areas of growth, and genetic traits." icon = 'icons/obj/device.dmi' icon_state = "hydro" item_state = "analyzer" @@ -10,6 +10,25 @@ w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron=30, /datum/material/glass=20) + var/scan_mode = PLANT_SCANMODE_STATS + +/obj/item/plant_analyzer/attack_self(mob/user) + . = ..() + scan_mode = !scan_mode + to_chat(user, "You switch [src] to [scan_mode == PLANT_SCANMODE_CHEMICALS ? "scan for chemical reagents and traits" : "scan for plant growth statistics"].") + +/obj/item/plant_analyzer/attack(mob/living/M, mob/living/carbon/human/user) + //Checks if target is a podman + if(ispodperson(M)) + user.visible_message("[user] analyzes [M]'s vitals.", \ + "You analyze [M]'s vitals.") + if(scan_mode== PLANT_SCANMODE_STATS) + healthscan(user, M, advanced = TRUE) + else + chemscan(user, M) + add_fingerprint(user) + return + return ..() // ************************************* // Hydroponics Tools diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index e1b3c85b75..d6022c1345 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -6,9 +6,10 @@ pixel_z = 8 obj_flags = CAN_BE_HIT | UNIQUE_RENAME circuit = /obj/item/circuitboard/machine/hydroponics + idle_power_usage = 0 var/waterlevel = 100 //The amount of water in the tray (max 100) var/maxwater = 100 //The maximum amount of water in the tray - var/nutrilevel = 10 //The amount of nutrient in the tray (max 10) + var/nutridrain = 1 // How many units of nutrient will be drained in the tray var/maxnutri = 10 //The maximum nutrient of water in the tray var/pestlevel = 0 //The amount of pests in the tray (max 10) var/weedlevel = 0 //The amount of weeds in the tray (max 10) @@ -16,21 +17,25 @@ var/mutmod = 1 //Nutriment's effect on mutations var/toxic = 0 //Toxicity in the tray? var/age = 0 //Current age - var/dead = 0 //Is it dead? + var/dead = FALSE //Is it dead? var/plant_health //Its health var/lastproduce = 0 //Last time it was harvested var/lastcycle = 0 //Used for timing of cycles. var/cycledelay = 200 //About 10 seconds / cycle - var/harvest = 0 //Ready to harvest? + var/harvest = FALSE //Ready to harvest? var/obj/item/seeds/myseed = null //The currently planted seed var/rating = 1 - var/unwrenchable = 1 + var/unwrenchable = TRUE var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant - var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses - var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood. - var/self_sufficiency_progress = 0 + var/mob/lastuser //Last user to add reagents to a tray. Mostly for logging. var/self_sustaining = FALSE //If the tray generates nutrients and water on its own - var/canirrigate = TRUE //tin + // Here lies irrigation. You won't be missed, because you were never used. + +/obj/machinery/hydroponics/Initialize() + //Here lies "nutrilevel", killed by ArcaneMusic 20??-2019. Finally, we strive for a better future. Please use "reagents" instead + create_reagents(20) + reagents.add_reagent(/datum/reagent/plantnutriment/eznutriment, 10) //Half filled nutrient trays for dirt trays to have more to grow with in prison/lavaland. + . = ..() /obj/machinery/hydroponics/constructable name = "hydroponics tray" @@ -43,14 +48,18 @@ tmp_capacity += M.rating for (var/obj/item/stock_parts/manipulator/M in component_parts) rating = M.rating - maxwater = tmp_capacity * 50 // Up to 300 - maxnutri = tmp_capacity * 5 // Up to 30 + maxwater = tmp_capacity * 50 // Up to 400 + maxnutri = (tmp_capacity * 5) + STATIC_NUTRIENT_CAPACITY // Up to 50 Maximum + reagents.maximum_volume = maxnutri + nutridrain = 1/rating /obj/machinery/hydroponics/constructable/examine(mob/user) . = ..() + . += "Use Ctrl-Click to activate autogrow. Alt-Click to empty the tray's nutrients." if(in_range(user, src) || isobserver(user)) . += "The status display reads: Tray efficiency at [rating*100]%." + /obj/machinery/hydroponics/Destroy() if(myseed) qdel(myseed) @@ -62,34 +71,11 @@ // handle opening the panel if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) return - - // handle deconstructing the machine, if permissible - if (I.tool_behaviour == TOOL_CROWBAR && using_irrigation) - to_chat(user, "Disconnect the hoses first!") - return - else if(default_deconstruction_crowbar(I)) + if(default_deconstruction_crowbar(I)) return return ..() -/obj/machinery/hydroponics/proc/FindConnected() - var/list/connected = list() - var/list/processing_atoms = list(src) - - while(processing_atoms.len) - var/atom/a = processing_atoms[1] - for(var/step_dir in GLOB.cardinals) - var/obj/machinery/hydroponics/h = locate() in get_step(a, step_dir) - // Soil plots aren't dense - if(h && h.using_irrigation && h.density && !(h in connected) && !(h in processing_atoms)) - processing_atoms += h - - processing_atoms -= a - connected += a - - return connected - - /obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables. if(!myseed) return ..() @@ -107,12 +93,16 @@ if(myseed && (myseed.loc != src)) myseed.forceMove(src) - if(self_sustaining) - adjustNutri(1) - adjustWater(rand(3,5)) - adjustWeeds(-2) - adjustPests(-2) - adjustToxic(-2) + if(!powered() && self_sustaining) + visible_message("[name]'s auto-grow functionality shuts off!") + idle_power_usage = 0 + self_sustaining = FALSE + update_icon() + + else if(self_sustaining) + adjustWater(rand(1,2)) + adjustWeeds(-1) + adjustPests(-1) if(world.time > (lastcycle + cycledelay)) lastcycle = world.time @@ -124,13 +114,17 @@ needs_update = 1 -//Nutrients////////////////////////////////////////////////////////////// - // Nutrients deplete slowly - if(prob(50)) - adjustNutri(-1 / rating) +//Nutrients////////////////////////////////////////////////////////////// + // Nutrients deplete at a constant rate, since new nutrients can boost stats far easier. + apply_chemicals(lastuser) + if(self_sustaining) + reagents.remove_any(min(0.5, nutridrain)) + else + reagents.remove_any(nutridrain) + // Lack of nutrients hurts non-weeds - if(nutrilevel <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) + if(reagents.total_volume <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) adjustHealth(-rand(1,3)) //Photosynthesis///////////////////////////////////////////////////////// @@ -156,7 +150,7 @@ adjustHealth(-rand(0,2) / rating) // Sufficient water level and nutrient level = plant healthy but also spawns weeds - else if(waterlevel > 10 && nutrilevel > 0) + else if(waterlevel > 10 && reagents.total_volume > 0) adjustHealth(rand(1,2) / rating) if(myseed && prob(myseed.weed_chance)) adjustWeeds(myseed.weed_rate) @@ -201,6 +195,21 @@ if(weedlevel >= 5 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) adjustHealth(-1 / rating) +//This is where stability mutations exist now. + if(myseed.instability >= 80) + var/mutation_chance = myseed.instability - 75 + mutate(0, 0, 0, 0, 0, 0, 0, mutation_chance, 0) //Scaling odds of a random trait or chemical + if(myseed.instability >= 60) + if(prob((myseed.instability)/2) && !self_sustaining && length(myseed.mutatelist)) //Minimum 30%, Maximum 50% chance of mutating every age tick when not on autogrow. + mutatespecie() + myseed.instability = myseed.instability/2 + if(myseed.instability >= 40) + if(prob(myseed.instability)) + hardmutate() + if(myseed.instability >= 20 ) + if(prob(myseed.instability)) + mutate() + //Health & Age/////////////////////////////////////////////////////////// // Plant dies if plant_health <= 0 @@ -214,15 +223,14 @@ // Harvest code if(age > myseed.production && (age - lastproduce) > myseed.production && (!harvest && !dead)) - nutrimentMutation() if(myseed && myseed.yield != -1) // Unharvestable shouldn't be harvested - harvest = 1 + harvest = TRUE else lastproduce = age if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase adjustPests(1 / rating) else - if(waterlevel > 10 && nutrilevel > 0 && prob(10)) // If there's no plant, the percentage chance is 10% + if(waterlevel > 10 && reagents.total_volume > 0 && prob(10)) // If there's no plant, the percentage chance is 10% adjustWeeds(1 / rating) // Weeeeeeeeeeeeeeedddssss @@ -243,25 +251,6 @@ selectedtrait.on_grow(src) return -/obj/machinery/hydroponics/proc/nutrimentMutation() - if (mutmod == 0) - return - if (mutmod == 1) - if(prob(80)) //80% - mutate() - else if(prob(75)) //15% - hardmutate() - return - if (mutmod == 2) - if(prob(50)) //50% - mutate() - else if(prob(50)) //25% - hardmutate() - else if(prob(50)) //12.5% - mutatespecie() - return - return - /obj/machinery/hydroponics/update_icon() //Refreshes the icon and sets the luminosity cut_overlays() @@ -273,8 +262,6 @@ add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "gaia_blessing")) set_light(3) - update_icon_hoses() - if(myseed) update_icon_plant() update_icon_lights() @@ -288,15 +275,6 @@ return -/obj/machinery/hydroponics/proc/update_icon_hoses() - var/n = 0 - for(var/Dir in GLOB.cardinals) - var/obj/machinery/hydroponics/t = locate() in get_step(src,Dir) - if(t && t.using_irrigation && using_irrigation) - n += Dir - - icon_state = "hoses-[n]" - /obj/machinery/hydroponics/proc/update_icon_plant() var/mutable_appearance/plant_overlay = mutable_appearance(myseed.growing_icon, layer = OBJ_LAYER + 0.01) if(dead) @@ -314,7 +292,7 @@ /obj/machinery/hydroponics/proc/update_icon_lights() if(waterlevel <= 10) add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowwater3")) - if(nutrilevel <= 2) + if(reagents.total_volume <= 2) add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lownutri3")) if(plant_health <= (myseed.endurance / 2)) add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowhealth3")) @@ -337,19 +315,17 @@ else . += "It's empty." - if(!self_sustaining) - . += "Water: [waterlevel]/[maxwater]." - . += "Nutrient: [nutrilevel]/[maxnutri]." - if(self_sufficiency_progress > 0) - var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req) - . += "Treatment for self-sustenance are [percent_progress]% complete." - else - . += "It doesn't require any water or nutrients." + . += "Water: [waterlevel]/[maxwater].\n"+\ + "Nutrient: [reagents.total_volume]/[maxnutri]." + if(self_sustaining) + . += "The tray's autogrow is active, halving active reagent drain, and actively maintaning the plant." if(weedlevel >= 5) - . += "It's filled with weeds!" + to_chat(user, "It's filled with weeds!") if(pestlevel >= 5) - . += "It's filled with tiny worms!" + to_chat(user, "It's filled with tiny worms!") + to_chat(user, "" ) + /obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, this happens. @@ -424,11 +400,7 @@ sleep(5) // Wait a while update_icon() visible_message("[oldPlantName] suddenly mutates into [myseed.plantname]!") - name = "hydroponics tray ([myseed.plantname])" - if(myseed.product) - desc = initial(myseed.product.desc) - else - desc = initial(desc) + TRAY_NAME_UPDATE /obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant if( weedlevel > 5 ) @@ -448,18 +420,23 @@ sleep(5) // Wait a while update_icon() visible_message("The mutated weeds in [src] spawn some [myseed.plantname]!") + TRAY_NAME_UPDATE else to_chat(usr, "The few weeds in [src] seem to react, but only for a moment...") -/obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one function to make things easier +/** + * Plant Death Proc. + * Cleans up various stats for the plant upon death, including pests, harvestability, and plant health. + */ +/obj/machinery/hydroponics/proc/plantdies() plant_health = 0 - harvest = 0 + harvest = FALSE pestlevel = 0 // Pests die + lastproduce = 0 if(!dead) update_icon() - dead = 1 - + dead = TRUE /obj/machinery/hydroponics/proc/mutatepest(mob/user) @@ -471,250 +448,6 @@ else to_chat(user, "The pests seem to behave oddly, but quickly settle down...") -/obj/machinery/hydroponics/proc/applyChemicals(datum/reagents/S, mob/user) - if(myseed) - myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines - - // Requires 5 mutagen to possibly change species.// Poor man's mutagen. - if(S.has_reagent(/datum/reagent/toxin/mutagen, 5) || S.has_reagent(/datum/reagent/radium, 10) || S.has_reagent(/datum/reagent/uranium, 10)) - switch(rand(100)) - if(91 to 100) - adjustHealth(-10) - to_chat(user, "The plant shrivels and burns.") - if(81 to 90) - mutatespecie() - if(66 to 80) - hardmutate() - if(41 to 65) - mutate() - if(21 to 41) - to_chat(user, "The plants don't seem to react...") - if(11 to 20) - mutateweed() - if(1 to 10) - mutatepest(user) - else - to_chat(user, "Nothing happens...") - - // 2 or 1 units is enough to change the yield and other stats.// Can change the yield and other stats, but requires more than mutagen - else if(S.has_reagent(/datum/reagent/toxin/mutagen, 2) || S.has_reagent(/datum/reagent/radium, 5) || S.has_reagent(/datum/reagent/uranium, 5)) - hardmutate() - else if(S.has_reagent(/datum/reagent/toxin/mutagen, 1) || S.has_reagent(/datum/reagent/radium, 2) || S.has_reagent(/datum/reagent/uranium, 2)) - mutate() - - // After handling the mutating, we now handle the damage from adding crude radioactives... - if(S.has_reagent(/datum/reagent/uranium, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/uranium) * 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/uranium) * 2)) - if(S.has_reagent(/datum/reagent/radium, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/radium) * 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/radium) * 3)) // Radium is harsher (OOC: also easier to produce) - - // Nutriments - if(S.has_reagent(/datum/reagent/plantnutriment/eznutriment, 1)) - yieldmod = 1 - mutmod = 1 - adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/eznutriment) * 1)) - - if(S.has_reagent(/datum/reagent/plantnutriment/left4zednutriment, 1)) - yieldmod = 0 - mutmod = 2 - adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/left4zednutriment) * 1)) - - if(S.has_reagent(/datum/reagent/plantnutriment/robustharvestnutriment, 1)) - yieldmod = 1.3 - mutmod = 0 - adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/robustharvestnutriment) *1 )) - - // Ambrosia Gaia produces earthsblood. - if(S.has_reagent(/datum/reagent/medicine/earthsblood)) - self_sufficiency_progress += S.get_reagent_amount(/datum/reagent/medicine/earthsblood) - if(self_sufficiency_progress >= self_sufficiency_req) - become_self_sufficient() - else if(!self_sustaining) - to_chat(user, "[src] warms as it might on a spring day under a genuine Sun.") - - // Antitoxin binds shit pretty well. So the tox goes significantly down - if(S.has_reagent(/datum/reagent/medicine/charcoal, 1)) - adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/charcoal) * 2)) - - // Toxins, not good for anything - if(S.has_reagent(/datum/reagent/toxin, 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin) * 2)) - - // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth. Not shrooms though. I can't deal with this now... - if(S.has_reagent(/datum/reagent/consumable/milk, 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.9)) - - // Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay? - if(S.has_reagent(/datum/reagent/consumable/ethanol/beer, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.05)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.25)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.7)) - - // Fluorine one of the most corrosive and deadly gasses - if(S.has_reagent(/datum/reagent/fluorine, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 2)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/fluorine) * 2.5)) - adjustWater(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 0.5)) - adjustWeeds(-rand(1,4)) - - // Chlorine one of the most corrosive and deadly gasses - if(S.has_reagent(/datum/reagent/chlorine, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/chlorine) * 1.5)) - adjustWater(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 0.5)) - adjustWeeds(-rand(1,3)) - - // White Phosphorous + water -> phosphoric acid. That's not a good thing really. - // Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much. - if(S.has_reagent(/datum/reagent/phosphorus, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.75)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.1)) - adjustWater(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.5)) - adjustWeeds(-rand(1,2)) - - // Plants should not have sugar, they can't use it and it prevents them getting water/nutients, it is good for mold though... - if(S.has_reagent(/datum/reagent/consumable/sugar, 1)) - adjustWeeds(rand(1,2)) - adjustPests(rand(1,2)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sugar) * 0.1)) - - // It is water! - if(S.has_reagent(/datum/reagent/water, 1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/water) * 1)) - - // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits~ - if(S.has_reagent(/datum/reagent/water/holywater, 1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 0.1)) - - // A variety of nutrients are dissolved in club soda, without sugar. - // These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth. - if(S.has_reagent(/datum/reagent/consumable/sodawater, 1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1)) - - // Sulphuric Acid - if(S.has_reagent(/datum/reagent/toxin/acid, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1.5)) - adjustWeeds(-rand(1,2)) - - // Acid - if(S.has_reagent(/datum/reagent/toxin/acid/fluacid, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 2)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 3)) - adjustWeeds(-rand(1,4)) - - // Plant-B-Gone is just as bad - if(S.has_reagent(/datum/reagent/toxin/plantbgone, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 5)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 6)) - adjustWeeds(-rand(4,8)) - - // Napalm, not known for being good for anything organic - if(S.has_reagent(/datum/reagent/napalm, 1)) - if(!(myseed.resistance_flags & FIRE_PROOF)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/napalm) * 6)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/napalm) * 7)) - adjustWeeds(-rand(5,9)) - - //Weed Spray - if(S.has_reagent(/datum/reagent/toxin/plantbgone/weedkiller, 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone/weedkiller) * 0.5)) - //old toxicity was 4, each spray is default 10 (minimal of 5) so 5 and 2.5 are the new ammounts - adjustWeeds(-rand(1,2)) - - //Pest Spray - if(S.has_reagent(/datum/reagent/toxin/pestkiller, 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/pestkiller) * 0.5)) - adjustPests(-rand(1,2)) - - // Healing - if(S.has_reagent(/datum/reagent/medicine/cryoxadone, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3)) - adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3)) - - // Ammonia is bad ass. - if(S.has_reagent(/datum/reagent/ammonia, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.5)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/ammonia) * 1)) - if(myseed) - myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.01)) - - // Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants - if(S.has_reagent(/datum/reagent/saltpetre, 1)) - var/salt = S.get_reagent_amount(/datum/reagent/saltpetre) - adjustHealth(round(salt * 0.25)) - if (myseed) - myseed.adjust_production(-round(salt/100)-prob(salt%100)) - myseed.adjust_potency(round(salt*0.5)) - - // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer - if(S.has_reagent(/datum/reagent/ash, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/ash) * 0.25)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/ash) * 0.5)) - adjustWeeds(-1) - - // Diethylamine is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. - if(S.has_reagent(/datum/reagent/diethylamine, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 2)) - if(myseed) - myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 0.02)) - adjustPests(-rand(1,2)) - - // Nutriment Compost, effectively - if(S.has_reagent(/datum/reagent/consumable/nutriment, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 0.5)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 1)) - - // Virusfood Compost for EVERYTHING - if(S.has_reagent(/datum/reagent/toxin/mutagen/mutagenvirusfood, 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/toxin/mutagen/mutagenvirusfood) * 0.5)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/mutagen/mutagenvirusfood) * 0.5)) - - // Blood - if(S.has_reagent(/datum/reagent/blood, 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/blood) * 1)) - adjustPests(rand(2,4)) - - // Strange reagent - if(S.has_reagent(/datum/reagent/medicine/strange_reagent, 1)) - spawnplant() - - // Honey, Pests are dieing of sugar, so is the plant - if(S.has_reagent(/datum/reagent/consumable/honey, 1)) - adjustPests(-rand(2,5)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/consumable/honey) * 1)) - - // Buzz Fuzz, a drink seemingly made for plants... - if(S.has_reagent(/datum/reagent/consumable/buzz_fuzz, 1)) - adjustPests(-rand(2,5)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/buzz_fuzz) * 0.1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/buzz_fuzz) * 0.5)) - - // Adminordrazine the best stuff there is. For testing/debugging. - if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1)) - adjustPests(-rand(1,5)) - adjustWeeds(-rand(1,5)) - if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 5)) - switch(rand(100)) - if(66 to 100) - mutatespecie() - if(33 to 65) - mutateweed() - if(1 to 32) - mutatepest(user) - else - to_chat(user, "Nothing happens...") - /obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params) //Called when mob user "attacks" it with object O if(istype(O, /obj/item/reagent_containers) ) // Syringe stuff (and other reagent containers now too) @@ -730,13 +463,20 @@ to_chat(user, "[reagent_source] is empty.") return 1 + if(reagents.total_volume >= reagents.maximum_volume && !reagent_source.reagents.has_reagent(/datum/reagent/water, 1)) + to_chat(user, "[src] is full.") + return + var/list/trays = list(src)//makes the list just this in cases of syringes and compost etc var/target = myseed ? myseed.plantname : src var/visi_msg = "" - var/irrigate = 0 //How am I supposed to irrigate pill contents? var/transfer_amount if(istype(reagent_source, /obj/item/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/reagent_containers/pill)) + if(istype(reagent_source, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/R = reagent_source + if (R.trash) + R.generate_trash(get_turf(user)) visi_msg="[user] composts [reagent_source], spreading it through [target]" transfer_amount = reagent_source.reagents.total_volume else @@ -746,41 +486,27 @@ visi_msg="[user] injects [target] with [syr]" if(syr.reagents.total_volume <= syr.amount_per_transfer_from_this) syr.mode = 0 - else if(istype(reagent_source, /obj/item/reagent_containers/spray/)) - visi_msg="[user] sprays [target] with [reagent_source]" - playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) - irrigate = 1 - else if(transfer_amount) // Droppers, cans, beakers, what have you. - visi_msg="[user] uses [reagent_source] on [target]" - irrigate = 1 // Beakers, bottles, buckets, etc. if(reagent_source.is_drainable()) - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - - if(irrigate && transfer_amount > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation) - trays = FindConnected() - if (trays.len > 1) - visi_msg += ", setting off the irrigation system" + playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) if(visi_msg) visible_message("[visi_msg].") - var/split = round(transfer_amount/trays.len) - + for(var/obj/machinery/hydroponics/H in trays) //cause I don't want to feel like im juggling 15 tamagotchis and I can get to my real work of ripping flooring apart in hopes of validating my life choices of becoming a space-gardener - - var/datum/reagents/S = new /datum/reagents() //This is a strange way, but I don't know of a better one so I can't fix it at the moment... - S.my_atom = H - - reagent_source.reagents.trans_to(S,split) + //This was originally in apply_chemicals, but due to apply_chemicals only holding nutrients, we handle it here now. + if(reagent_source.reagents.has_reagent(/datum/reagent/water, 1)) + var/water_amt = reagent_source.reagents.get_reagent_amount(/datum/reagent/water) * transfer_amount / reagent_source.reagents.total_volume + H.adjustWater(round(water_amt)) + reagent_source.reagents.remove_reagent(/datum/reagent/water, water_amt) + reagent_source.reagents.trans_to(H.reagents, transfer_amount) if(istype(reagent_source, /obj/item/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/reagent_containers/pill)) qdel(reagent_source) - - H.applyChemicals(S, user) - - S.clear_reagents() - qdel(S) + lastuser = user + H.update_icon() + return 1 H.update_icon() if(reagent_source) // If the source wasn't composted and destroyed reagent_source.update_icon() @@ -793,39 +519,43 @@ if(!user.transferItemToLoc(O, src)) return to_chat(user, "You plant [O].") - dead = 0 + dead = FALSE myseed = O - name = "hydroponics tray ([myseed.plantname])" - if(!myseed.productdesc) //we haven't changed our produce's description - if(myseed.product) - myseed.productdesc = initial(myseed.product.desc) - else if(myseed.desc) - myseed.productdesc = myseed.desc - else - myseed.productdesc = "A fascinating specimen." - desc = myseed.productdesc + TRAY_NAME_UPDATE age = 1 plant_health = myseed.endurance lastcycle = world.time update_icon() + return else to_chat(user, "[src] already has seeds in it!") + return else if(istype(O, /obj/item/plant_analyzer)) + var/obj/item/plant_analyzer/P_analyzer = O if(myseed) - to_chat(user, "*** [myseed.plantname] ***" ) - to_chat(user, "- Plant Age: [age]") - var/list/text_string = myseed.get_analyzer_text() - if(text_string) - to_chat(user, text_string) + if(P_analyzer.scan_mode == PLANT_SCANMODE_STATS) + to_chat(user, "*** [myseed.plantname] ***" ) + to_chat(user, "- Plant Age: [age]") + var/list/text_string = myseed.get_analyzer_text() + if(text_string) + to_chat(user, text_string) + to_chat(user, "*---------*") + if(myseed.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 myseed.genes) + to_chat(user, "- [G.get_name()] -") + to_chat(user, "*---------*") else to_chat(user, "No plant found.") to_chat(user, "- Weed level: [weedlevel] / 10") to_chat(user, "- Pest level: [pestlevel] / 10") to_chat(user, "- Toxicity level: [toxic] / 100") to_chat(user, "- Water level: [waterlevel] / [maxwater]") - to_chat(user, "- Nutrition level: [nutrilevel] / [maxnutri]") + to_chat(user, "- Nutrition level: [reagents.total_volume] / [maxnutri]") to_chat(user, "") + return else if(istype(O, /obj/item/cultivator)) if(weedlevel > 0) @@ -843,18 +573,6 @@ else if(default_unfasten_wrench(user, O)) return - else if(istype(O, /obj/item/wirecutters) && unwrenchable) - if (!anchored) - to_chat(user, "Anchor the tray first!") - return - if(canirrigate) - using_irrigation = !using_irrigation - O.play_tool_sound(src) - user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \ - "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.") - for(var/obj/machinery/hydroponics/h in range(1,src)) - h.update_icon() - else if(istype(O, /obj/item/shovel/spade)) if(!myseed && !weedlevel) to_chat(user, "[src] doesn't have any plants or weeds!") @@ -882,14 +600,12 @@ if (!unwrenchable) // case also covered by NODECONSTRUCT checks in default_unfasten_wrench return CANT_UNFASTEN - if (using_irrigation) - if (!silent) - to_chat(user, "Disconnect the hoses first!") - return FAILED_UNFASTEN - return ..() -/obj/machinery/hydroponics/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) +/obj/machinery/hydroponics/attack_hand(mob/user) + . = ..() + if(.) + return if(issilicon(user)) //How does AI know what plant is? return if(harvest) @@ -897,41 +613,62 @@ return else if(dead) - dead = 0 + dead = FALSE to_chat(user, "You remove the dead plant from [src].") qdel(myseed) myseed = null update_icon() - name = initial(name) - desc = initial(desc) + TRAY_NAME_UPDATE else if(user) examine(user) +/obj/machinery/hydroponics/CtrlClick(mob/user) + . = ..() + if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + if(!powered()) + to_chat(user, "[name] has no power.") + return + if(!anchored) + return + self_sustaining = !self_sustaining + idle_power_usage = self_sustaining ? 2500 : 0 + to_chat(user, "You [self_sustaining ? "activate" : "deactivated"] [src]'s autogrow function[self_sustaining ? ", maintaining the tray's health while using high amounts of power" : ""].") + update_icon() + +/obj/machinery/hydroponics/AltClick(mob/user) + . = ..() + if(!anchored) + update_icon() + return FALSE + var/warning = alert(user, "Are you sure you wish to empty the tray's nutrient beaker?","Empty Tray Nutrients?", "Yes", "No") + if(warning == "Yes" && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + reagents.clear_reagents() + to_chat(user, "You empty [src]'s nutrient tank.") + /obj/machinery/hydroponics/proc/update_tray(mob/user) - harvest = 0 + harvest = FALSE lastproduce = age if(istype(myseed, /obj/item/seeds/replicapod)) - if(user)//runtimes - to_chat(user, "You harvest from the [myseed.plantname].") + to_chat(user, "You harvest from the [myseed.plantname].") else if(myseed.getYield() <= 0) - if(user) - to_chat(user, "You fail to harvest anything useful!") + to_chat(user, "You fail to harvest anything useful!") else - if(user) - to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") + to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest)) qdel(myseed) myseed = null - dead = 0 + dead = FALSE name = initial(name) desc = initial(desc) + TRAY_NAME_UPDATE + if(self_sustaining) //No reason to pay for an empty tray. + idle_power_usage = 0 + self_sustaining = FALSE update_icon() - + /// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds./// -/obj/machinery/hydroponics/proc/adjustNutri(adjustamt) - nutrilevel = clamp(nutrilevel + adjustamt, 0, maxnutri) - /obj/machinery/hydroponics/proc/adjustWater(adjustamt) waterlevel = clamp(waterlevel + adjustamt, 0, maxwater) @@ -957,11 +694,6 @@ var/mob/living/simple_animal/hostile/C = new chosen C.faction = list("plants") -/obj/machinery/hydroponics/proc/become_self_sufficient() // Ambrosia Gaia effect - visible_message("[src] begins to glow with a beautiful light!") - self_sustaining = TRUE - update_icon() - /////////////////////////////////////////////////////////////////////////////// /obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk! name = "soil" @@ -974,9 +706,6 @@ flags_1 = NODECONSTRUCT_1 unwrenchable = FALSE -/obj/machinery/hydroponics/soil/update_icon_hoses() - return // Has no hoses - /obj/machinery/hydroponics/soil/update_icon_lights() return // Has no lights @@ -986,3 +715,6 @@ qdel(src) else return ..() + +/obj/machinery/hydroponics/soil/CtrlClick(mob/user) + return //Dirt doesn't have electricity, last I checked. diff --git a/code/modules/hydroponics/hydroponics_chemreact.dm b/code/modules/hydroponics/hydroponics_chemreact.dm new file mode 100644 index 0000000000..a4ef78a21f --- /dev/null +++ b/code/modules/hydroponics/hydroponics_chemreact.dm @@ -0,0 +1,32 @@ +/** + *This is NOW the gradual affects that each chemical applies on every process() proc. Nutrients now use a more robust reagent holder in order to apply less insane + * stat changes as opposed to 271 lines of individual statline effects. Shoutout to the original comments on chems, I just cleaned a few up. + */ +/obj/machinery/hydroponics/proc/apply_chemicals(mob/user) + ///Contains the reagents within the tray. + if(myseed) + myseed.on_chem_reaction(reagents) //In case seeds have some special interactions with special chems, currently only used by vines + for(var/c in reagents.reagent_list) + var/datum/reagent/chem = c + chem.on_hydroponics_apply(myseed, reagents, src, user) + + +/obj/machinery/hydroponics/proc/mutation_roll(mob/user) + switch(rand(100)) + if(91 to 100) + adjustHealth(-10) + visible_message("\The [myseed.plantname] starts to wilt and burn!") + return + if(41 to 90) + if(myseed && !self_sustaining) //Stability + myseed.adjust_instability(5) + return + if(21 to 40) + visible_message("\The [myseed.plantname] appears unusually reactive...") + return + if(11 to 20) + mutateweed() + return + if(1 to 10) + mutatepest(user) + return diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 887ea0417c..da19fa11f8 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -89,6 +89,12 @@ /datum/plant_gene/core/potency/apply_stat(obj/item/seeds/S) S.potency = value +/datum/plant_gene/core/instability + name = "Stability" + value = 10 + +/datum/plant_gene/core/instability/apply_stat(obj/item/seeds/S) + S.instability = value /datum/plant_gene/core/weed_rate name = "Weed Growth Rate" diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index c7314bf180..2dc80cd8fc 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) . = ..() @@ -61,6 +63,7 @@ genes += new /datum/plant_gene/core/production(production) if(potency != -1) genes += new /datum/plant_gene/core/potency(potency) + genes += new /datum/plant_gene/core/instability(instability) for(var/p in genes) if(ispath(p)) @@ -74,6 +77,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 +92,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 @@ -121,18 +129,20 @@ obj/item/seeds/proc/is_gene_forbidden(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) +/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)) 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)) @@ -165,13 +175,40 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) /obj/item/seeds/proc/harvest(mob/user) + ///Reference to the tray/soil the seeds are planted in. var/obj/machinery/hydroponics/parent = loc //for ease of access + ///Count used for creating the correct amount of results to the harvest. var/t_amount = 0 + ///List of plants all harvested from the same batch. var/list/result = list() + ///Tile of the harvester to deposit the growables. var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //needed for TK + ///Name of the grown products. var/product_name - while(t_amount < getYield()) - var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src) + ///The Number of products produced by the plant, typically the yield. + 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 +223,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 +300,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 +365,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 +405,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 +416,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 +425,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/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index e8981ed685..9abf5d86a0 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -261,13 +261,11 @@ set_pin_data(IC_OUTPUT, 12, H.pestlevel) set_pin_data(IC_OUTPUT, 13, H.toxic) set_pin_data(IC_OUTPUT, 14, H.waterlevel) - set_pin_data(IC_OUTPUT, 15, H.nutrilevel) + set_pin_data(IC_OUTPUT, 15, H.reagents.total_volume) set_pin_data(IC_OUTPUT, 16, H.harvest) set_pin_data(IC_OUTPUT, 17, H.dead) set_pin_data(IC_OUTPUT, 18, H.plant_health) set_pin_data(IC_OUTPUT, 19, H.self_sustaining) - set_pin_data(IC_OUTPUT, 20, H.using_irrigation) - set_pin_data(IC_OUTPUT, 21, H.FindConnected()) push_data() activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 991c806f43..f69fa08aaf 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -19,30 +19,26 @@ // Hydroponics trays have no reagents holder and handle reagents in their own snowflakey way. // This is a dirty hack to make injecting reagents into them work. // TODO: refactor that. -/obj/item/integrated_circuit/reagent/proc/inject_tray(obj/machinery/hydroponics/tray, atom/movable/source, amount) - var/atom/movable/acting_object = get_object() - var/list/trays = list(tray) - var/visi_msg = "[acting_object] transfers fluid into [tray]" +//Time for someone to refactor this. Trays can now hold reagents. +//obj/item/integrated_circuit/reagent/proc/inject_tray(obj/machinery/hydroponics/tray, atom/movable/source, amount) + //var/atom/movable/acting_object = get_object() + //var/list/trays = list(tray) + //var/visi_msg = "[acting_object] transfers fluid into [tray]" - if(amount > 30 && source.reagents.total_volume >= 30 && tray.using_irrigation) - trays = tray.FindConnected() - if (trays.len > 1) - visi_msg += ", setting off the irrigation system" + //acting_object.visible_message("[visi_msg].") + //playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - acting_object.visible_message("[visi_msg].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + //var/split = round(amount/trays.len) - var/split = round(amount/trays.len) + //for(var/obj/machinery/hydroponics/H in trays) + //var/datum/reagents/temp_reagents = new /datum/reagents() + //temp_reagents.my_atom = H - for(var/obj/machinery/hydroponics/H in trays) - var/datum/reagents/temp_reagents = new /datum/reagents() - temp_reagents.my_atom = H + //source.reagents.trans_to(temp_reagents, split) + //H.on_hydroponics_apply(temp_reagents) - source.reagents.trans_to(temp_reagents, split) - H.applyChemicals(temp_reagents) - - temp_reagents.clear_reagents() - qdel(temp_reagents) + //temp_reagents.clear_reagents() + //qdel(temp_reagents) /obj/item/integrated_circuit/reagent/injector name = "integrated hypo-injector" @@ -116,10 +112,10 @@ return if(!AM.reagents) - if(istype(AM, /obj/machinery/hydroponics) && direction_mode == SYRINGE_INJECT && reagents.total_volume && transfer_amount)//injection into tray. - inject_tray(AM, src, transfer_amount) - activate_pin(2) - return + //if(istype(AM, /obj/machinery/hydroponics) && direction_mode == SYRINGE_INJECT && reagents.total_volume && transfer_amount)//injection into tray. + //inject_tray(AM, src, transfer_amount) + //activate_pin(2) + //return activate_pin(3) return @@ -242,13 +238,14 @@ if(!source.reagents) return - if(!target.reagents) + //if(!target.reagents) // Hydroponics trays have no reagents holder and handle reagents in their own snowflakey way. // This is a dirty hack to make injecting reagents into them work. - if(istype(target, /obj/machinery/hydroponics) && source.reagents.total_volume) - inject_tray(target, source, transfer_amount) - activate_pin(2) - return + //Someone should redo this. Trays should hold reagents now. + //if(istype(target, /obj/machinery/hydroponics) && source.reagents.total_volume) + //inject_tray(target, source, transfer_amount) + //activate_pin(2) + //return if(!source.is_drainable() || !target.is_refillable()) return diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm index 8496d27aee..20b8e6012a 100644 --- a/code/modules/plumbing/plumbers/autohydro.dm +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -4,8 +4,6 @@ icon_state = "hydrotray4" obj_flags = CAN_BE_HIT | UNIQUE_RENAME circuit = /obj/item/circuitboard/machine/hydroponics/automagic - self_sufficiency_req = 400 //automating hydroponics makes gaia sad so she needs more drugs to turn they tray godly. - canirrigate = FALSE /obj/machinery/hydroponics/constructable/automagic/attackby(obj/item/O, mob/user, params) @@ -44,7 +42,7 @@ /obj/machinery/hydroponics/constructable/automagic/process() if(reagents) - applyChemicals(reagents) + reagents.add_reagent(reagents) reagents.clear_reagents() if(dead) dead = 0 diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 672127cb11..d6b7201ef9 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -213,6 +213,16 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) if(prob(30)) to_chat(M, "You're not feeling good at all! You really need some [name].") +/** + * New, standardized method for chemicals to affect hydroponics trays. + * Defined on a per-chem level as opposed to by the tray. + * Can affect plant's health, stats, or cause the plant to react in certain ways. + */ +/datum/reagent/proc/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + if(!mytray || !chems) + return + return + /proc/pretty_string_from_reagent_list(list/reagent_list) //Convert reagent list to a printable string for logging etc var/list/rs = list() diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 289b92f06d..c2bb678904 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -90,6 +90,13 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A freezing pint of beer." pH = 4 + // Beer is a chemical composition of alcohol and various other things. It's a garbage nutrient but hey, it's still one. Also alcohol is bad, mmmkay? +/datum/reagent/consumable/ethanol/beer/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 0.05)) + mytray.adjustWater(round(chems.get_reagent_amount(src.type) * 0.7)) + /datum/reagent/consumable/ethanol/beer/light name = "Light Beer" description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety has reduced calorie and alcohol content." diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 3675efa283..37fc075c6f 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -214,6 +214,14 @@ pH = 6.5 value = REAGENT_VALUE_VERY_COMMON + // Milk is good for humans, but bad for plants. The sugars cannot be used by plants, and the milk fat harms growth. Not shrooms though. I can't deal with this now... +/datum/reagent/consumable/milk/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(type) * 0.3)) + if(myseed) + myseed.adjust_potency(-chems.get_reagent_amount(type) * 0.5) + /datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M) if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER)) M.heal_bodypart_damage(1.5,0, 0) @@ -607,6 +615,15 @@ glass_name = "honeycomb of Buzz Fuzz" glass_desc = "Stinging with flavour." + //This drink seems to be just made for plants.. how curious. +/datum/reagent/consumable/buzz_fuzz/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src,1)) + mytray.adjustPests(-rand(2,5)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.1)) + if(myseed) + myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.5)) + /datum/reagent/consumable/buzz_fuzz/on_mob_life(mob/living/carbon/M) M.reagents.add_reagent(/datum/reagent/consumable/sugar,1) if(prob(5)) @@ -678,6 +695,15 @@ glass_name = "glass of soda water" glass_desc = "Soda water. Why not make a scotch and soda?" + + // A variety of nutrients are dissolved in club soda, without sugar. + // These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth. +/datum/reagent/consumable/sodawater/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(type) * 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(type) * 0.1)) + /datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/M) M.dizziness = max(0,M.dizziness-5) M.drowsyness = max(0,M.drowsyness-3) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 18203f1a4c..7979c7b0c7 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -157,6 +157,13 @@ taste_description = "sweetness" value = REAGENT_VALUE_NONE +// Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though... +/datum/reagent/consumable/sugar/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustWeeds(rand(2,3)) + mytray.adjustPests(rand(1,2)) + /datum/reagent/consumable/sugar/overdose_start(mob/living/M) to_chat(M, "You go into hyperglycaemic shock! Lay off the twinkies!") M.AdjustSleeping(600, FALSE) @@ -174,6 +181,12 @@ color = "#899613" // rgb: 137, 150, 19 taste_description = "watery milk" +// Compost for EVERYTHING +/datum/reagent/consumable/virus_food/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 0.5)) + /datum/reagent/consumable/soysauce name = "Soysauce" description = "A salty sauce made from the soy plant." diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 37010cbbb5..f3d299cce5 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -36,6 +36,25 @@ taste_description = "badmins" value = REAGENT_VALUE_GLORIOUS +// The best stuff there is. For testing/debugging. +/datum/reagent/medicine/adminordrazine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(type) * 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(type) * 1)) + mytray.adjustPests(-rand(1,5)) + mytray.adjustWeeds(-rand(1,5)) + if(chems.has_reagent(type, 3)) + switch(rand(100)) + if(66 to 100) + mytray.mutatespecie() + if(33 to 65) + mytray.mutateweed() + if(1 to 32) + mytray.mutatepest(user) + else if(prob(20)) + mytray.visible_message("Nothing happens...") + /datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M) M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) M.setCloneLoss(0, 0) @@ -1168,6 +1187,11 @@ ..() . = 1 +// Antitoxin binds plants pretty well. So the tox goes significantly down +/datum/reagent/medicine/antitoxin/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 2)) + /datum/reagent/medicine/inaprovaline name = "Inaprovaline" description = "Stabilizes the breathing of patients. Good for those in critical condition." @@ -1297,6 +1321,21 @@ pH = 11 value = REAGENT_VALUE_COMMON //not any higher. Ambrosia is a milestone for hydroponics already. + +//Earthsblood is still a wonderdrug. Just... don't expect to be able to mutate something that makes plants so healthy. +/datum/reagent/medicine/earthsblood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustPests(-rand(1,3)) + mytray.adjustWeeds (-rand(1,3)) + if(myseed) + myseed.adjust_instability(-round(chems.get_reagent_amount(src.type) * 1.3)) + myseed.adjust_potency(round(chems.get_reagent_amount(src.type) *1)) + myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 1)) + myseed.adjust_endurance(round(chems.get_reagent_amount(src.type) * 0.5)) + myseed.adjust_production(-round(chems.get_reagent_amount(src.type) * 0.5)) + /datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-3 * REM, FALSE) M.adjustFireLoss(-3 * REM, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 86f8b341d9..418062ce92 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -13,6 +13,12 @@ shot_glass_icon_state = "shotglassred" pH = 7.4 +// FEED ME,SEYMOUR! +/datum/reagent/blood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustPests(rand(2,3)) + /datum/reagent/blood/reaction_mob(mob/living/L, method = TOUCH, reac_volume) if(data && data["viruses"]) for(var/thing in data["viruses"]) @@ -313,6 +319,13 @@ metabolization_rate = 45 * REAGENTS_METABOLISM . = 1 +///For weird backwards situations where water manages to get added to trays nutrients, as opposed to being snowflaked away like usual. +/datum/reagent/water/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + if(chems.has_reagent(src.type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(src.type) * 1)) + //You don't belong in this world, monster! + chems.remove_reagent(/datum/reagent/water, chems.get_reagent_amount(src.type)) + /datum/reagent/water/hollowwater name = "Hollow Water" description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow." @@ -329,6 +342,14 @@ glass_desc = "A glass of holy water." pH = 7.5 //God is alkaline + // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits. Also ALSO increases instability. +/datum/reagent/water/holywater/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + if(chems.has_reagent(src.type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.1)) + if(myseed) + myseed.adjust_instability(round(chems.get_reagent_amount(src.type) * 0.15)) + /datum/reagent/water/holywater/on_mob_metabolize(mob/living/L) . = ..() ADD_TRAIT(L, TRAIT_HOLY, type) @@ -401,6 +422,13 @@ qdel(R) T.Bless() +/datum/reagent/water/holywater/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + mytray.adjustWater(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.1)) + if(myseed) + myseed.adjust_instability(round(chems.get_reagent_amount(src.type) * 0.15)) + /datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke name = "Unholy Water" overdose_threshold = 150 //Same as normal water @@ -973,6 +1001,15 @@ taste_description = "chlorine" pH = 7.4 +// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial +/datum/reagent/chlorine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(src.type) * 1.5)) + mytray.adjustWater(-round(chems.get_reagent_amount(src.type) * 0.5)) + mytray.adjustWeeds(-rand(1,3)) + /datum/reagent/chlorine/on_mob_life(mob/living/carbon/M) M.take_bodypart_damage(1*REM, 0, 0, 0) . = 1 @@ -986,6 +1023,15 @@ taste_description = "acid" pH = 2 +// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial +/datum/reagent/fluorine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 2)) + mytray.adjustToxic(round(chems.get_reagent_amount(src.type) * 2.5)) + mytray.adjustWater(-round(chems.get_reagent_amount(src.type) * 0.5)) + mytray.adjustWeeds(-rand(1,4)) + /datum/reagent/fluorine/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(1*REM, 0) . = 1 @@ -1037,6 +1083,12 @@ taste_description = "the colour blue and regret" pH = 10 +/datum/reagent/radium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(src.type) * 1)) + /datum/reagent/radium/on_mob_life(mob/living/carbon/M) M.apply_effect(2*REM/M.metabolism_efficiency,EFFECT_IRRADIATE,0) ..() @@ -1148,6 +1200,14 @@ GG = new/obj/effect/decal/cleanable/greenglow(T) GG.reagents.add_reagent(/datum/reagent/uranium, reac_volume) +//Mutagenic chem side-effects. +/datum/reagent/uranium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + mytray.mutation_roll(user) + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(src.type) * 2)) + /datum/reagent/bluespace name = "Bluespace Dust" description = "A dust composed of microscopic bluespace crystals, with minor space-warping properties." @@ -1406,6 +1466,15 @@ taste_description = "mordant" pH = 11.6 +/datum/reagent/ammonia/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + // Ammonia is bad ass. + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.12)) + if(myseed && prob(10)) + myseed.adjust_yield(1) + myseed.adjust_instability(1) + /datum/reagent/diethylamine name = "Diethylamine" description = "A secondary amine, mildly corrosive." @@ -1413,6 +1482,16 @@ taste_description = "iron" pH = 12 +// This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. The new trade off is it culls stability. +/datum/reagent/diethylamine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustPests(-rand(1,2)) + if(myseed) + myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 1)) + myseed.adjust_instability(-round(chems.get_reagent_amount(src.type) * 1)) + /datum/reagent/carbondioxide name = "Carbon Dioxide" reagent_state = GAS @@ -1606,24 +1685,68 @@ /datum/reagent/plantnutriment/eznutriment name = "E-Z-Nutrient" - description = "Cheap and extremely common type of plant nutriment." + description = "Contains electrolytes. It's what plants crave." color = "#376400" // RBG: 50, 100, 0 tox_prob = 10 - pH = 2.5 + +/datum/reagent/plantnutriment/eznutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + myseed.adjust_instability(0.2) + myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.3)) + myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 0.1)) /datum/reagent/plantnutriment/left4zednutriment name = "Left 4 Zed" description = "Unstable nutriment that makes plants mutate more often than usual." color = "#1A1E4D" // RBG: 26, 30, 77 tox_prob = 25 - pH = 3.5 + +/datum/reagent/plantnutriment/left4zednutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.1)) + myseed.adjust_instability(round(chems.get_reagent_amount(src.type) * 0.2)) /datum/reagent/plantnutriment/robustharvestnutriment name = "Robust Harvest" - description = "Very potent nutriment that prevents plants from mutating." + description = "Very potent nutriment that slows plants from mutating." color = "#9D9D00" // RBG: 157, 157, 0 tox_prob = 15 - pH = 2.5 + +/datum/reagent/plantnutriment/robustharvestnutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + myseed.adjust_instability(-0.25) + myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.1)) + myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 0.2)) + +/datum/reagent/plantnutriment/endurogrow + name = "Enduro Grow" + description = "A specialized nutriment, which decreases product quantity and potency, but strengthens the plants endurance." + color = "#a06fa7" // RBG: 160, 111, 167 + tox_prob = 15 + +/datum/reagent/plantnutriment/endurogrow/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + myseed.adjust_potency(-round(chems.get_reagent_amount(src.type) * 0.1)) + myseed.adjust_yield(-round(chems.get_reagent_amount(src.type) * 0.075)) + myseed.adjust_endurance(round(chems.get_reagent_amount(src.type) * 0.35)) + +/datum/reagent/plantnutriment/liquidearthquake + name = "Liquid Earthquake" + description = "A specialized nutriment, which increases the plant's production speed, as well as it's susceptibility to weeds." + color = "#912e00" // RBG: 145, 46, 0 + tox_prob = 25 + +/datum/reagent/plantnutriment/liquidearthquake/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + myseed.adjust_weed_rate(round(chems.get_reagent_amount(src.type) * 0.1)) + myseed.adjust_weed_chance(round(chems.get_reagent_amount(src.type) * 0.3)) + myseed.adjust_production(-round(chems.get_reagent_amount(src.type) * 0.075)) + // GOON OTHERS @@ -1679,6 +1802,13 @@ taste_description = "ash" pH = 6.5 +// Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer +/datum/reagent/ash/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustWeeds(-1) + /datum/reagent/acetone name = "Acetone" description = "A slick, slightly carcinogenic liquid. Has a multitude of mundane uses in everyday life." @@ -1799,6 +1929,16 @@ taste_description = "alkali" //who put ACID for NaOH ???? pH = 11.9 +// Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants +/datum/reagent/saltpetre/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + var/salt = chems.get_reagent_amount(src.type) + mytray.adjustHealth(round(salt * 0.18)) + if(myseed) + myseed.adjust_production(-round(salt/10)-prob(salt%10)) + myseed.adjust_potency(round(salt*1)) + /datum/reagent/drying_agent name = "Drying agent" description = "A desiccant. Can be used to dry things." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 07934d9880..0d0a234afc 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -10,6 +10,12 @@ value = REAGENT_VALUE_COMMON //Encouraging people to mix toxins for reasons beyond harming each other or mixing reagents such as pen acid. var/toxpwr = 1.5 +// Are you a bad enough dude to poison your own plants? +/datum/reagent/toxin/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 2)) + /datum/reagent/toxin/on_mob_life(mob/living/carbon/M) if(toxpwr) M.adjustToxLoss(toxpwr*REM, 0) @@ -54,6 +60,11 @@ C.apply_effect(5,EFFECT_IRRADIATE,0) return ..() +/datum/reagent/toxin/mutagen/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + mytray.mutation_roll(user) + if(chems.has_reagent(type, 1)) + mytray.adjustToxic(1.5) //It is still toxic, mind you, but not to the same degree. + /datum/reagent/toxin/plasma name = "Plasma" description = "Plasma in its liquid form." @@ -245,6 +256,13 @@ pH = 2.7 value = REAGENT_VALUE_NONE +/datum/reagent/toxin/plantbgone/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 10)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 6)) + mytray.adjustWeeds(-rand(4,8)) + /datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume) if(istype(O, /obj/structure/alien/weeds)) var/obj/structure/alien/weeds/alien_weeds = O @@ -270,6 +288,14 @@ pH = 3 value = REAGENT_VALUE_NONE +//Weed Spray +/datum/reagent/toxin/plantbgone/weedkiller/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + if(!mytray) + return + if(chems.has_reagent(type, 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 0.5)) + mytray.adjustWeeds(-rand(1,2)) + /datum/reagent/toxin/pestkiller name = "Pest Killer" description = "A harmful toxic mixture to kill pests. Do not ingest!" @@ -278,6 +304,14 @@ pH = 3.2 value = REAGENT_VALUE_NONE +//Pest Spray +/datum/reagent/toxin/pestkiller/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + if(!mytray) + return + if(chems.has_reagent(type, 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 1)) + mytray.adjustPests(-rand(1,2)) + /datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume) ..() if(M.mob_biotypes & MOB_BUG) @@ -838,6 +872,14 @@ pH = 2.75 value = REAGENT_VALUE_NONE +// Sure, go ahead and pour acid on your precious plants. What's the worst that could happen? +/datum/reagent/toxin/acid/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 1.5)) + mytray.adjustWeeds(-rand(1,2)) + /datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) if(!istype(C)) return @@ -870,6 +912,14 @@ acidpwr = 42.0 value = REAGENT_VALUE_COMMON +// ACID II: UNHEEDED WARNINGS +/datum/reagent/toxin/acid/fluacid/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 2)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 3)) + mytray.adjustWeeds(-rand(1,4)) + /datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/M) M.adjustFireLoss(current_cycle/10, 0) . = 1 diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index 2cf9df6d50..bdaf39732f 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -77,6 +77,22 @@ make_reagents = list(/datum/reagent/plantnutriment/robustharvestnutriment = 10) category = list("initial","Botany Chemicals") +/datum/design/end_gro + name = "30u Enduro Grow" + id = "end_gro" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass= 30) + make_reagents = list(/datum/reagent/plantnutriment/endurogrow = 30) + category = list("initial","Botany Chemicals") + +/datum/design/liq_earth + name = "30u Liquid Earthquake" + id = "liq_earth" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass= 30) + make_reagents = list(/datum/reagent/plantnutriment/liquidearthquake = 30) + category = list("initial","Botany Chemicals") + /datum/design/weed_killer name = "Weed Killer" id = "weed_killer" diff --git a/strings/tips.txt b/strings/tips.txt index 5dc4e1b985..2039b30359 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -163,7 +163,7 @@ As a Botanist, you can mutate the plants growing in your hydroponics trays with As a Botanist, you should look into increasing the potency of your plants. This is shown by the size of the plant's sprite, and can increase the amount of chemicals, points gained from grinding them in the biogenerator, and lets people know you are a proficient botanist. As a Botanist, you can combine production trait chemicals and mix your own complex chemicals inside of the plants themselves using precursors. Chlorine (blumpkin) + radium and phosphorus (glowshrooms) equals unstable mutagen! As a Botanist, earthsblood is an incredibly powerful chemical found in Ambrosia Gaia, it heals all types of damages very rapidly but causes lingering brain damage and has a nasty overdose. You can combine the chemicals from watermelons (water), grass (hydrogen), and cherries (sugar) to mix mannitol in with your earthsblood to completely counteract its main drawback! -As a Botanist, Ambrosia Gaia is a plant mutated from Ambrosia Deus, which is a plant mutated from Ambrosia Vulgaris. The reagent contained within this plant known as earthsblood can make your trays and soil plots completely self sufficient when a plant containing such reagent is composted into them, meaning they won't need nutrients or water, and they'll automatically kill their own weeds and pests. +As a Botanist, Ambrosia Gaia is a plant mutated from Ambrosia Deus, which is a plant mutated from Ambrosia Vulgaris. The reagent contained within this plant known as earthsblood makes for a vastly superior fertilizer than most, giving decent stat boosts to most stats, and automatically killing weeds and pests! As a Cook, you can load your food into snack vending machines. As a Cook, you can rename your custom made food with a pen. As a Cook, any food you make will be much healthier than the junk food found in vendors. Having the crew routinely eating from you will provide minor buffs. diff --git a/tgstation.dme b/tgstation.dme index 44394e0673..2c25780671 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -26,6 +26,7 @@ #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" +#include "code\__DEFINES\botany.dm" #include "code\__DEFINES\bsql.config.dm" #include "code\__DEFINES\bsql.dm" #include "code\__DEFINES\callbacks.dm" @@ -2135,6 +2136,7 @@ #include "code\modules\hydroponics\growninedible.dm" #include "code\modules\hydroponics\hydroitemdefines.dm" #include "code\modules\hydroponics\hydroponics.dm" +#include "code\modules\hydroponics\hydroponics_chemreact.dm" #include "code\modules\hydroponics\plant_genes.dm" #include "code\modules\hydroponics\sample.dm" #include "code\modules\hydroponics\seed_extractor.dm"