diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 79cc5601bec23..cdfa63b3be975 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -968,10 +968,27 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/seeds/amanita, /obj/item/seeds/reishi, /obj/item/seeds/banana, - /obj/item/seeds/eggplant/eggy) + /obj/item/seeds/eggplant/eggy, + /obj/item/seeds/random, + /obj/item/seeds/random) cost = 15 containername = "exotic seeds crate" +/datum/supply_packs/organic/hydroponics/xenohydrophonics + name = "Xenohydrophonics Supply Crate" + contains = list(/obj/item/seeds/random, + /obj/item/seeds/random, + /obj/item/seeds/random, + /obj/item/seeds/random, + /obj/item/seeds/random, + /obj/item/seeds/random, + /obj/item/seeds/random, + /obj/item/seeds/random, + /obj/item/seeds/random, + /obj/item/seeds/random) + cost = 20 + containername = "xenohydrophonics supply crate" + /datum/supply_packs/organic/vending name = "Bartending Supply Crate" contains = list(/obj/item/weapon/vending_refill/boozeomat, diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d4bdeaa76c379..a6b4ab40f1413 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -850,7 +850,7 @@ /obj/item/seeds/tea = 3,/obj/item/seeds/tobacco = 3,/obj/item/seeds/tomato = 3, /obj/item/seeds/tower = 3,/obj/item/seeds/watermelon = 3,/obj/item/seeds/wheat = 3,/obj/item/seeds/whitebeet = 3) contraband = list(/obj/item/seeds/amanita = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/liberty = 2,/obj/item/seeds/nettle = 2, - /obj/item/seeds/plump = 2,/obj/item/seeds/reishi = 2) + /obj/item/seeds/plump = 2,/obj/item/seeds/reishi = 2,/obj/item/seeds/cannabis = 3, /obj/item/seeds/random = 2) premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1) diff --git a/code/modules/food&drinks/food/snacks/meat.dm b/code/modules/food&drinks/food/snacks/meat.dm index 2f0f5bfdb54cb..eedaf2fa2b0f8 100644 --- a/code/modules/food&drinks/food/snacks/meat.dm +++ b/code/modules/food&drinks/food/snacks/meat.dm @@ -161,7 +161,13 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/spider - +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatwheat + name = "meatwheat clump" + desc = "This doesn't look like meat, but your standards aren't that high to begin with." + list_reagents = list("nutriment" = 3, "vitamin" = 2, "blood" = 5) + filling_color = rgb(150, 0, 0) + icon_state = "meatwheat_clump" + bitesize = 4 ////////////////////////////////////// MEAT STEAKS /////////////////////////////////////////////////////////// diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index 9b2115934a0cd..703f272a82164 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -320,7 +320,9 @@ /datum/plant_gene/core/yield, /datum/plant_gene/core/production, /datum/plant_gene/core/endurance, - /datum/plant_gene/core/lifespan + /datum/plant_gene/core/lifespan, + /datum/plant_gene/core/weed_rate, + /datum/plant_gene/core/weed_chance ) for(var/a in gene_paths) core_genes += seed.get_gene(a) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index dc4f17f6071f5..5d23644e7d77c 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -80,8 +80,10 @@ msg += reag_txt msg += "
*---------*" user << msg - return - return + else + if(seed) + for(var/datum/plant_gene/trait/T in seed.genes) + T.on_attackby(src, O, user) // Various gene procs @@ -111,8 +113,9 @@ new trash(T) visible_message("[src] has been squashed.","You hear a smack.") - for(var/datum/plant_gene/trait/trait in seed.genes) - trait.on_squash(src, target) + if(seed) + for(var/datum/plant_gene/trait/trait in seed.genes) + trait.on_squash(src, target) for(var/A in T) reagents.reaction(A) diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index 87d8bffef59ca..d6064862951b1 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -21,6 +21,7 @@ yield = 6 potency = 5 icon_dead = "ambrosia-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/ambrosia/deus) reagents_add = list("space_drugs" = 0.15, "bicaridine" = 0.1, "kelotane" = 0.1, "vitamin" = 0.04, "nutriment" = 0.05, "toxin" = 0.1) @@ -28,6 +29,7 @@ seed = /obj/item/seeds/ambrosia name = "ambrosia vulgaris branch" desc = "This is a plant containing various healing chemicals." + origin_tech = "biotech=2" // Ambrosia Deus /obj/item/seeds/ambrosia/deus @@ -37,7 +39,7 @@ species = "ambrosiadeus" plantname = "Ambrosia Deus" product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus - mutatelist = list() + mutatelist = list(/obj/item/seeds/ambrosia/gaia) reagents_add = list("omnizine" = 0.15, "synaptizine" = 0.15, "space_drugs" = 0.1, "vitamin" = 0.04, "nutriment" = 0.05) rarity = 40 @@ -46,4 +48,27 @@ name = "ambrosia deus branch" desc = "Eating this makes you feel immortal!" icon_state = "ambrosiadeus" - filling_color = "#008B8B" \ No newline at end of file + filling_color = "#008B8B" + origin_tech = "biotech=4;materials=3" + +//Ambrosia Gaia +/obj/item/seeds/ambrosia/gaia + name = "pack of ambrosia gaia seeds" + desc = "These seeds grow into ambrosia gaia, incredibly rare but imbued with breathtaking potential." + icon_state = "seed-ambrosia_gaia" + species = "ambrosia_gaia" + plantname = "Ambrosia Gaia" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia + mutatelist = list() + reagents_add = list("earthsblood" = 0.4, "nutriment" = 0.2, "vitamin" = 0.1) + rarity = 100 //These are some pretty good plants right here + genes = list() + +/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia + name = "ambrosia gaia branch" + desc = "Eating this makes you immortal." + icon_state = "ambrosia_gaia" + filling_color = rgb(255, 175, 0) + origin_tech = "biotech=7" + luminosity = 3 + seed = /obj/item/seeds/ambrosia/gaia diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 3c95377067793..c041d7c0cfe97 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -11,6 +11,7 @@ yield = 5 icon_grow = "apple-grow" icon_dead = "apple-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/apple/gold) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) @@ -51,4 +52,5 @@ name = "golden apple" desc = "Emblazoned upon the apple is the word 'Kallisti'." icon_state = "goldapple" - filling_color = "#FFD700" \ No newline at end of file + filling_color = "#FFD700" + origin_tech = "biotech=4;materials=5" diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 685f652f4817d..eeff713df4150 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -9,7 +9,7 @@ lifespan = 50 endurance = 30 icon_dead = "banana-dead" - genes = list(/datum/plant_gene/trait/slip) + genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/banana/mime, /obj/item/seeds/banana/bluespace) reagents_add = list("banana" = 0.1, "vitamin" = 0.04, "nutriment" = 0.02) @@ -65,6 +65,7 @@ mutatelist = list() reagents_add = list("nothing" = 0.1, "mutetoxin" = 0.1, "nutriment" = 0.02) rarity = 15 + genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest) /obj/item/weapon/reagent_containers/food/snacks/grown/banana/mime seed = /obj/item/seeds/banana/mime @@ -90,7 +91,7 @@ plantname = "Bluespace Banana Tree" product = /obj/item/weapon/reagent_containers/food/snacks/grown/banana/bluespace mutatelist = list() - genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport) + genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/repeated_harvest) reagents_add = list("singulo" = 0.2, "banana" = 0.1, "vitamin" = 0.04, "nutriment" = 0.02) rarity = 30 diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index f9c21811375c9..7952666c5e695 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -12,6 +12,7 @@ growthstages = 4 icon_grow = "soybean-grow" icon_dead = "soybean-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/soya/koi) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index db8aefabd3b3b..66b39f0d0eb50 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -12,6 +12,7 @@ yield = 2 icon_grow = "berry-grow" // Uses one growth icons set for all the subtypes icon_dead = "berry-dead" // Same for the dead icon + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/berry/glow, /obj/item/seeds/berry/poison) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) @@ -75,7 +76,7 @@ lifespan = 30 endurance = 25 mutatelist = list() - genes = list(/datum/plant_gene/trait/glow/berry) + genes = list(/datum/plant_gene/trait/glow/berry , /datum/plant_gene/trait/noreact) reagents_add = list("uranium" = 0.25, "iodine" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) rarity = 20 @@ -101,6 +102,7 @@ growthstages = 5 icon_grow = "cherry-grow" icon_dead = "cherry-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/cherry/blue) reagents_add = list("nutriment" = 0.07, "sugar" = 0.07) @@ -121,7 +123,7 @@ species = "bluecherry" plantname = "Blue Cherry Tree" product = /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries - mutatelist = list() + mutatelist = list(/obj/item/seeds/cherry/bomb) reagents_add = list("nutriment" = 0.07, "sugar" = 0.07) rarity = 10 @@ -133,6 +135,32 @@ filling_color = "#6495ED" bitesize_mod = 2 +//Cherry Bombs +/obj/item/seeds/cherry/bomb + name = "pack of cherry bomb pits" + desc = "They give you vibes of dread and frustration." + icon_state = "seed-cherry_bomb" + species = "cherry_bomb" + plantname = "Cherry Bomb Tree" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb + mutatelist = list() + reagents_add = list("nutriment" = 0.1, "sugar" = 0.1, "blackpowder" = 0.1) + rarity = 25 + +/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb + name = "cherry bombs" + desc = "You think you can hear the hissing of a tiny fuse." + icon_state = "cherry_bomb" + filling_color = rgb(20, 20, 20) + seed = /obj/item/seeds/cherry/bomb + bitesize_mod = 2 + +/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user) + var/area/A = get_area(user) + user.visible_message("[user] plucks the stem from [src]!", "You pluck the stem from [src], which begins to hiss loudly!") + message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP)") + log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).") + prime() // Grapes /obj/item/seeds/grape @@ -150,6 +178,7 @@ growthstages = 2 icon_grow = "grape-grow" icon_dead = "grape-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/grape/green) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1, "sugar" = 0.1) diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm new file mode 100644 index 0000000000000..1e9d829116f5e --- /dev/null +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -0,0 +1,125 @@ +// Cannabis +/obj/item/seeds/cannabis + name = "pack of cannabis seeds" + desc = "Taxable." + icon_state = "seed-cannabis" + species = "cannabis" + plantname = "Cannabis Plant" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis + maturation = 8 + potency = 20 + growthstages = 1 + icon_grow = "cannabis-grow" // Uses one growth icons set for all the subtypes + icon_dead = "cannabis-dead" // Same for the dead icon + genes = list(/datum/plant_gene/trait/repeated_harvest) + mutatelist = list(/obj/item/seeds/cannabis/rainbow, + /obj/item/seeds/cannabis/death, + /obj/item/seeds/cannabis/white, + /obj/item/seeds/cannabis/ultimate) + reagents_add = list("space_drugs" = 0.15, "lipolicide" = 0.35) // gives u the munchies + + +/obj/item/seeds/cannabis/rainbow + name = "pack of rainbow weed seeds" + desc = "These seeds grow into rainbow weed. Groovy." + icon_state = "seed-megacannabis" + species = "megacannabis" + plantname = "Rainbow Weed" + icon_grow = "megacannabis-grow" + icon_dead = "megacannabis-dead" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/rainbow + mutatelist = list() + reagents_add = list("mindbreaker" = 0.15, "lipolicide" = 0.35) + rarity = 40 + +/obj/item/seeds/cannabis/death + name = "pack of deathweed seeds" + desc = "These seeds grow into deathweed. Not groovy." + icon_state = "seed-blackcannabis" + species = "blackcannabis" + plantname = "Deathweed" + icon_grow = "blackcannabis-grow" + icon_dead = "blackcannabis-dead" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/death + mutatelist = list() + reagents_add = list("cyanide" = 0.35, "space_drugs" = 0.15, "lipolicide" = 0.15) + rarity = 40 + +/obj/item/seeds/cannabis/white + name = "pack of lifeweed seeds" + desc = "I will give unto him that is munchies of the fountain of the cravings of life, freely." + icon_state = "seed-whitecannabis" + species = "whitecannabis" + plantname = "Lifeweed" + icon_grow = "whitecannabis-grow" + icon_dead = "whitecannabis-dead" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/white + mutatelist = list() + reagents_add = list("omnizine" = 0.35, "space_drugs" = 0.15, "lipolicide" = 0.15) + rarity = 40 + + +/obj/item/seeds/cannabis/ultimate + name = "pack of omega weed seeds" + desc = "These seeds grow into omega weed." + icon_state = "seed-ocannabis" + species = "ocannabis" + plantname = "Omega Weed" + icon_grow = "ocannabis-grow" + icon_dead = "ocannabis-dead" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/ultimate + mutatelist = list() + reagents_add = list("space_drugs" = 0.3, + "mindbreaker" = 0.3, + "mercury" = 0.15, + "lithium" = 0.15, + "atropine" = 0.15, + "haloperidol" = 0.15, + "methamphetamine" = 0.15, + "capsaicin" = 0.15, + "barbers_aid" = 0.15, + "bath_salts" = 0.15, + "itching_powder" = 0.15, + "crank" = 0.15, + "krokodil" = 0.15, + "histamine" = 0.15, + "lipolicide" = 0.15) + rarity = 69 + + +// --------------------------------------------------------------- + +/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis + seed = /obj/item/seeds/cannabis + icon = 'goon/icons/obj/hydroponics.dmi' + name = "cannabis leaf" + desc = "Recently legalized in most galaxies." + icon_state = "cannabis" + filling_color = "#00FF00" + bitesize_mod = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/rainbow + seed = /obj/item/seeds/cannabis/rainbow + name = "rainbow cannabis leaf" + desc = "Is it supposed to be glowing like that...?" + icon_state = "megacannabis" + +/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/death + seed = /obj/item/seeds/cannabis/death + name = "death cannabis leaf" + desc = "Looks a bit dark. Oh well." + icon_state = "blackcannabis" + +/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/white + seed = /obj/item/seeds/cannabis/white + name = "white cannabis leaf" + desc = "It feels smooth and nice to the touch." + icon_state = "whitecannabis" + +/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/ultimate + seed = /obj/item/seeds/cannabis/ultimate + name = "omega cannibas leaf" + desc = "You feel dizzy looking at it. What the fuck?" + icon_state = "ocannabis" + volume = 420 diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 8b6274c4e0973..66c5a17a841ee 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -9,9 +9,8 @@ production = 1 yield = 4 potency = 15 - oneharvest = 1 icon_dead = "wheat-dead" - mutatelist = list(/obj/item/seeds/wheat/oat) + mutatelist = list(/obj/item/seeds/wheat/oat, /obj/item/seeds/wheat/meat) reagents_add = list("nutriment" = 0.04) /obj/item/weapon/reagent_containers/food/snacks/grown/wheat @@ -60,4 +59,32 @@ gender = PLURAL icon_state = "rice" filling_color = "#FAFAD2" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + +//Meatwheat - grows into synthetic meat +/obj/item/seeds/wheat/meat + name = "pack of meatwheat seeds" + desc = "If you ever wanted to drive a vegetarian to insanity, here's how." + icon_state = "seed-meatwheat" + species = "meatwheat" + plantname = "Meatwheat" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat + mutatelist = list() + +/obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat + name = "meatwheat" + desc = "Some blood-drenched wheat stalks. You can crush them into what passes for meat if you squint hard enough." + icon_state = "meatwheat" + gender = PLURAL + filling_color = rgb(150, 0, 0) + bitesize_mod = 2 + seed = /obj/item/seeds/wheat/meat + +/obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user) + user.visible_message("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.") + playsound(user, 'sound/effects/blobattack.ogg', 50, 1) + var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatwheat/M = new(get_turf(user)) + user.drop_item() + qdel(src) + user.put_in_hands(M) + return 1 diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 707b92e4ee87e..0fa72f4d7883d 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -13,6 +13,7 @@ potency = 20 icon_grow = "chili-grow" // Uses one growth icons set for all the subtypes icon_dead = "chili-dead" // Same for the dead icon + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/chili/ice, /obj/item/seeds/chili/ghost) reagents_add = list("capsaicin" = 0.25, "vitamin" = 0.04, "nutriment" = 0.04) @@ -53,7 +54,7 @@ desc = "These seeds grow into a chili said to be the hottest in the galaxy." icon_state = "seed-chilighost" species = "chilighost" - plantname = "chilighost" + plantname = "Ghost Chili Plants" product = /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili endurance = 10 maturation = 10 diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index cec228a8f4ada..12afcdb5a240b 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -18,6 +18,7 @@ endurance = 50 yield = 4 potency = 15 + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/orange) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) @@ -42,6 +43,7 @@ potency = 20 icon_grow = "lime-grow" icon_dead = "lime-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/lime) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) @@ -85,6 +87,7 @@ product = /obj/item/weapon/reagent_containers/food/snacks/grown/shell/moneyfruit icon_grow = "lime-grow" icon_dead = "lime-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) lifespan = 55 endurance = 45 yield = 4 diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 54ee9db28bc1f..0eec40c494e04 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -13,6 +13,7 @@ growthstages = 5 icon_grow = "cocoapod-grow" icon_dead = "cocoapod-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/cocoapod/vanillapod) reagents_add = list("cocoa" = 0.25, "nutriment" = 0.1) @@ -32,6 +33,7 @@ species = "vanillapod" plantname = "Vanilla Tree" product = /obj/item/weapon/reagent_containers/food/snacks/grown/vanillapod + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list() reagents_add = list("vanilla" = 0.25, "nutriment" = 0.1) diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 22bcf1c1ce1e0..8267a081482b0 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -7,7 +7,6 @@ plantname = "Corn Stalks" product = /obj/item/weapon/reagent_containers/food/snacks/grown/corn maturation = 8 - oneharvest = 1 potency = 20 growthstages = 3 icon_grow = "corn-grow" // Uses one growth icons set for all the subtypes @@ -43,6 +42,8 @@ user.unEquip(src) qdel(src) return + else + return ..() // Snapcorn /obj/item/seeds/corn/snapcorn diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm index f99d07ff4d72d..3d9d243218c17 100644 --- a/code/modules/hydroponics/grown/eggplant.dm +++ b/code/modules/hydroponics/grown/eggplant.dm @@ -10,6 +10,7 @@ potency = 20 icon_grow = "eggplant-grow" icon_dead = "eggplant-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/eggplant/eggy) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 11ce454871f64..331d9516995ac 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -10,7 +10,6 @@ maturation = 8 yield = 6 potency = 20 - oneharvest = 1 growthstages = 3 icon_grow = "poppy-grow" icon_dead = "poppy-dead" @@ -75,9 +74,8 @@ production = 1 yield = 2 potency = 30 - oneharvest = 1 growthstages = 4 - plant_type = PLANT_WEED + genes = list(/datum/plant_gene/trait/plant_type/weed_hardy) reagents_add = list("nutriment" = 0.04) /obj/item/weapon/reagent_containers/food/snacks/grown/harebell @@ -101,7 +99,6 @@ endurance = 20 production = 2 yield = 2 - oneharvest = 1 growthstages = 3 icon_grow = "sunflower-grow" icon_dead = "sunflower-dead" diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index a4f3e55b60467..c4cf599b58613 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -14,6 +14,7 @@ growthstages = 2 icon_grow = "grass-grow" icon_dead = "grass-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/grass/carpet) reagents_add = list("nutriment" = 0.02) diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index 013b93c94b544..8e08c9ac7ccf6 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -7,11 +7,11 @@ species = "kudzu" plantname = "Kudzu" product = /obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy) lifespan = 20 endurance = 10 yield = 4 growthstages = 4 - plant_type = PLANT_WEED rarity = 30 var/list/mutations = list() reagents_add = list("charcoal" = 0.04, "nutriment" = 0.02) diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 3460cde8926d9..bc3ba71ba2310 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -9,8 +9,9 @@ lifespan = 50 endurance = 40 icon_dead = "watermelon-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/watermelon/holy) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.2) + reagents_add = list("water" = 0.2, "vitamin" = 0.04, "nutriment" = 0.2) /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon seed = /obj/item/seeds/watermelon diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index de334bb609882..c5a8b11462620 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -11,9 +11,8 @@ production = 1 yield = -1 potency = -1 - oneharvest = 1 growthstages = 4 - plant_type = PLANT_WEED + genes = list(/datum/plant_gene/trait/plant_type/weed_hardy) // Cabbage @@ -30,6 +29,7 @@ production = 5 yield = 4 growthstages = 1 + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/replicapod) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) @@ -50,6 +50,7 @@ species = "sugarcane" plantname = "Sugarcane" product = /obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane + genes = list(/datum/plant_gene/trait/repeated_harvest) lifespan = 60 endurance = 50 maturation = 3 @@ -74,6 +75,7 @@ species = "gatfruit" plantname = "gatfruit" product = /obj/item/weapon/reagent_containers/food/snacks/grown/shell/gatfruit + genes = list(/datum/plant_gene/trait/repeated_harvest) lifespan = 20 endurance = 20 maturation = 40 @@ -91,4 +93,44 @@ icon_state = "gatfruit" origin_tech = "combat=3" trash = /obj/item/weapon/gun/projectile/revolver - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + +//Cherry Bombs +/obj/item/seeds/cherry/bomb + name = "pack of cherry bomb pits" + desc = "They give you vibes of dread and frustration." + icon_state = "seed-cherry_bomb" + species = "cherry_bomb" + plantname = "Cherry Bomb Tree" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb + mutatelist = list() + reagents_add = list("nutriment" = 0.1, "sugar" = 0.1, "blackpowder" = 0.7) + rarity = 60 //See above + +/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb + name = "cherry bombs" + desc = "You think you can hear the hissing of a tiny fuse." + icon_state = "cherry_bomb" + filling_color = rgb(20, 20, 20) + seed = /obj/item/seeds/cherry/bomb + bitesize_mod = 2 + volume = 125 //Gives enough room for the black powder at max potency + + //obj_integrity = 40 //Higher in the hierachy might port later + //max_integrity = 40 + +/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user) + var/area/A = get_area(user) + user.visible_message("[user] plucks the stem from [src]!", "You pluck the stem from [src], which begins to hiss loudly!") + message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP)") + log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).") + prime() + +/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/ex_act(severity) + qdel(src) //Ensuring that it's deleted by its own explosion. Also prevents mass chain reaction with piles of cherry bombs + +/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime() + icon_state = "cherry_bomb_lit" + playsound(src, 'sound/effects/fuse.ogg', seed.potency, 0) + reagents.chem_temp = 1000 //Sets off the black powder + reagents.handle_reactions() diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 15ba4dc9d6c90..865f04b319160 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -17,9 +17,8 @@ production = 5 yield = 4 potency = 15 - oneharvest = 1 growthstages = 4 - plant_type = PLANT_MUSHROOM + genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) reagents_add = list("morphine" = 0.35, "charcoal" = 0.35, "nutriment" = 0) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi @@ -43,9 +42,8 @@ maturation = 10 production = 5 yield = 4 - oneharvest = 1 growthstages = 3 - plant_type = PLANT_MUSHROOM + genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = list(/obj/item/seeds/angel) reagents_add = list("mushroomhallucinogen" = 0.04, "amatoxin" = 0.35, "nutriment" = 0) @@ -71,9 +69,8 @@ production = 5 yield = 2 potency = 35 - oneharvest = 1 growthstages = 3 - plant_type = PLANT_MUSHROOM + genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) reagents_add = list("mushroomhallucinogen" = 0.04, "amatoxin" = 0.8, "nutriment" = 0, "amanitin" = 0.2) rarity = 30 @@ -97,9 +94,8 @@ production = 1 yield = 5 potency = 15 - oneharvest = 1 growthstages = 3 - plant_type = PLANT_MUSHROOM + genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) reagents_add = list("mushroomhallucinogen" = 0.25, "nutriment" = 0.02) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap @@ -122,9 +118,8 @@ production = 1 yield = 4 potency = 15 - oneharvest = 1 growthstages = 3 - plant_type = PLANT_MUSHROOM + genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = list(/obj/item/seeds/plump/walkingmushroom) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) @@ -186,9 +181,8 @@ production = 1 yield = 5 potency = 15 - oneharvest = 1 growthstages = 3 - plant_type = PLANT_MUSHROOM + genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) reagents_add = list("nutriment" = 0.1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle @@ -213,11 +207,9 @@ production = 1 yield = 3 //-> spread potency = 30 //-> brightness - oneharvest = 1 growthstages = 4 - plant_type = PLANT_MUSHROOM rarity = 20 - genes = list(/datum/plant_gene/trait/glow) + genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = list(/obj/item/seeds/glowshroom/glowcap) reagents_add = list("radium" = 0.1, "phosphorus" = 0.1, "nutriment" = 0.04) @@ -250,9 +242,8 @@ icon_grow = "glowshroom-grow" icon_dead = "glowshroom-dead" plantname = "Glowcaps" - plant_type = PLANT_MUSHROOM product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap - genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/cell_charge) + genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/cell_charge, /datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = list() reagents_add = list("nutriment" = 0.04) rarity = 30 diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index 431f69ce9ad61..35a287bbcc4b2 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -9,7 +9,7 @@ endurance = 40 // tuff like a toiger yield = 4 growthstages = 5 - plant_type = PLANT_WEED + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy) mutatelist = list(/obj/item/seeds/nettle/death) reagents_add = list("sacid" = 0.5) @@ -23,11 +23,11 @@ endurance = 25 maturation = 8 yield = 2 + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/stinging) mutatelist = list() reagents_add = list("facid" = 0.5, "sacid" = 0.5) rarity = 20 - /obj/item/weapon/grown/nettle //abstract type name = "nettle" desc = "It's probably not wise to touch it with bare hands..." @@ -90,7 +90,7 @@ icon_state = "deathnettle" force = 30 throwforce = 15 - origin_tech = "combat=3" + origin_tech = "combat=5" /obj/item/weapon/grown/nettle/death/add_juice() ..() diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 7ada77c855785..626ef7017ab72 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -10,10 +10,10 @@ maturation = 10 production = 1 yield = 4 - oneharvest = 1 growthstages = 4 icon_grow = "potato-grow" icon_dead = "potato-dead" + genes = list(/datum/plant_gene/trait/battery) mutatelist = list(/obj/item/seeds/potato/sweet) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) @@ -25,31 +25,6 @@ filling_color = "#E9967A" bitesize = 100 -/obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W, mob/user, params) - ..() - if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = W - if (C.use(5)) - user << "You add some cable to the potato and slide it inside the battery encasing." - var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(user.loc) - pocell.maxcharge = seed.potency * 20 - - // The secret of potato supercells! - var/datum/plant_gene/trait/cell_charge/G = seed.get_gene(/datum/plant_gene/trait/cell_charge) - if(G) // 10x charge for deafult cell charge gene - 20 000 with 100 potency. - pocell.maxcharge *= G.rate*1000 - pocell.charge = pocell.maxcharge - pocell.desc = "A rechargable starch based power cell. This one has a power rating of [pocell.maxcharge], and you should not swallow it." - - if(reagents.has_reagent("plasma", 2)) - pocell.rigged = 1 - - qdel(src) - return - else - user << "You need five lengths of cable to make a potato battery!" - return - // Sweet Potato /obj/item/seeds/potato/sweet name = "pack of sweet potato seeds" diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 8f2dd7225641c..601233114ec55 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -11,6 +11,7 @@ growthstages = 3 icon_grow = "pumpkin-grow" icon_dead = "pumpkin-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/pumpkin/blumpkin) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.2) @@ -29,6 +30,8 @@ new /obj/item/clothing/head/hardhat/pumpkinhead(user.loc) qdel(src) return + else + return ..() // Blumpkin /obj/item/seeds/pumpkin/blumpkin diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm new file mode 100644 index 0000000000000..1f48f83c9a57a --- /dev/null +++ b/code/modules/hydroponics/grown/random.dm @@ -0,0 +1,29 @@ +//Random seeds; stats, traits, and plant type are randomized for each seed. + +/obj/item/seeds/random + name = "pack of strange seeds" + desc = "Mysterious seeds as strange as their name implies. Spooky" + icon_state = "seed-x" + species = "?????" + plantname = "strange plant" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/random + icon_grow = "xpod-grow" + icon_dead = "xpod-dead" + icon_harvest = "xpod-harvest" + growthstages = 4 + +/obj/item/seeds/random/New() + randomize_stats() + ..() + if(prob(60)) + add_random_reagents() + if(prob(50)) + add_random_traits() + add_random_plant_type(35) + +/obj/item/weapon/reagent_containers/food/snacks/grown/random + seed = /obj/item/seeds/random + name = "strange plant" + desc = "What could this even be?" + icon_state = "crunchy" + bitesize_mod = 2 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index ffe8657f35fe6..b33cc7be9903f 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -12,7 +12,6 @@ maturation = 10 production = 1 yield = 1 //seeds if there isn't a dna inside - oneharvest = 1 potency = 30 var/ckey = null var/realName = null @@ -42,7 +41,8 @@ user << "The seeds reject the sample!" else user << "The seeds already contain a genetic sample!" - ..() + else + return ..() /obj/item/seeds/replicapod/get_analyzer_text() var/text = ..() diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 9b981708d07d8..65779fdd4db95 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -9,7 +9,6 @@ maturation = 10 production = 1 yield = 5 - oneharvest = 1 growthstages = 3 mutatelist = list(/obj/item/seeds/carrot/parsnip) reagents_add = list("oculine" = 0.25, "vitamin" = 0.04, "nutriment" = 0.05) @@ -53,7 +52,6 @@ lifespan = 60 endurance = 50 yield = 6 - oneharvest = 1 icon_dead = "whitebeet-dead" mutatelist = list(/obj/item/seeds/redbeet) reagents_add = list("vitamin" = 0.04, "sugar" = 0.2, "nutriment" = 0.05) @@ -77,8 +75,8 @@ lifespan = 60 endurance = 50 yield = 6 - oneharvest = 1 icon_dead = "whitebeet-dead" + genes = list(/datum/plant_gene/trait/maxchem) reagents_add = list("vitamin" = 0.05, "nutriment" = 0.05) /obj/item/weapon/reagent_containers/food/snacks/grown/redbeet diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index f4909c9aad873..028841533850d 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -12,6 +12,7 @@ yield = 5 growthstages = 5 icon_dead = "tea-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/tea/astra) reagents_add = list("vitamin" = 0.04, "teapowder" = 0.1) @@ -55,6 +56,7 @@ yield = 5 growthstages = 5 icon_dead = "coffee-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/coffee/robusta) reagents_add = list("vitamin" = 0.04, "coffeepowder" = 0.1) diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index d7aa22e4f9cb2..9437ae7e7ff49 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -9,7 +9,6 @@ lifespan = 20 maturation = 5 production = 5 - oneharvest = 1 yield = 10 growthstages = 3 icon_dead = "tobacco-dead" diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 2e2dc8815bb52..f1b8d107c1ec1 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -9,7 +9,7 @@ maturation = 8 icon_grow = "tomato-grow" icon_dead = "tomato-dead" - genes = list(/datum/plant_gene/trait/squash) + genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/tomato/blue, /obj/item/seeds/tomato/blood, /obj/item/seeds/tomato/killer) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) @@ -54,7 +54,7 @@ yield = 2 icon_grow = "bluetomato-grow" mutatelist = list(/obj/item/seeds/tomato/blue/bluespace) - genes = list(/datum/plant_gene/trait/slip) + genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest) reagents_add = list("lube" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) rarity = 20 @@ -69,21 +69,21 @@ // Bluespace Tomato /obj/item/seeds/tomato/blue/bluespace - name = "pack of blue-space tomato seeds" - desc = "These seeds grow into blue-space tomato plants." + name = "pack of bluespace tomato seeds" + desc = "These seeds grow into bluespace tomato plants." icon_state = "seed-bluespacetomato" species = "bluespacetomato" - plantname = "Blue-Space Tomato Plants" + plantname = "Bluespace Tomato Plants" product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace yield = 2 mutatelist = list() - genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport) + genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/repeated_harvest) reagents_add = list("lube" = 0.2, "singulo" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) rarity = 50 /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace seed = /obj/item/seeds/tomato/blue/bluespace - name = "blue-space tomato" + name = "bluespace tomato" desc = "So lubricated, you might slip through space-time." icon_state = "bluespacetomato" @@ -97,7 +97,7 @@ plantname = "Killer-Tomato Plants" product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer yield = 2 - oneharvest = 1 + genes = list(/datum/plant_gene/trait/squash) growthstages = 2 icon_grow = "killertomato-grow" icon_harvest = "killertomato-harvest" diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 9b1a685ac5915..1f86e8e7c71d4 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -11,10 +11,9 @@ production = 1 yield = 5 potency = 50 - oneharvest = 1 growthstages = 3 icon_dead = "towercap-dead" - plant_type = PLANT_MUSHROOM + genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = list(/obj/item/seeds/tower/steel) /obj/item/seeds/tower/steel @@ -76,6 +75,8 @@ return else usr << "You must dry this first!" + else + return ..() /obj/item/weapon/grown/log/tree seed = null diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index b2104f19d3365..e3bb416c59367 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -69,6 +69,12 @@ loc.set_light(-G.get_lum(seed)) return ..() +/obj/item/weapon/grown/throw_impact(atom/hit_atom) + if(!..()) //was it caught by a mob? + if(seed) + for(var/datum/plant_gene/trait/T in seed.genes) + T.on_throw_impact(src, hit_atom) + /obj/item/weapon/grown/pickup(mob/user) ..() var/datum/plant_gene/trait/glow/G = seed.get_gene(/datum/plant_gene/trait/glow) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index c6cef589f23fa..8dacd6a65d08c 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "hydrotray" density = 1 - anchored = 1 // anchored == 2 means the hoses are screwed in place + anchored = 1 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) @@ -15,7 +15,7 @@ var/toxic = 0 //Toxicity in the tray? var/age = 0 //Current age var/dead = 0 //Is it dead? - var/health = 0 //Its health. + 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 @@ -24,6 +24,9 @@ var/rating = 1 var/unwrenchable = 1 var/co2mod = 1 + var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpolinate one plant + var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses + var/self_sustaining = FALSE //If the tray generates nutrients and water on its own pixel_y=8 @@ -53,6 +56,12 @@ waterlevel = maxwater nutrilevel = 3 +/obj/machinery/hydroponics/Destroy() + if(myseed) + qdel(myseed) + myseed = null + return ..() + /obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "hydrotray3", "hydrotray3", I)) return @@ -67,12 +76,12 @@ return if(istype(I, /obj/item/weapon/crowbar)) - if(anchored==2) + if(using_irrigation) user << "Unscrew the hoses first!" + else if(default_deconstruction_crowbar(I, 1)) return - default_deconstruction_crowbar(I, 1) - ..() - + else + return ..() /obj/machinery/hydroponics/proc/FindConnected() @@ -85,8 +94,8 @@ for(var/step_dir in cardinal) var/obj/machinery/hydroponics/h = locate() in get_step(a, step_dir) - // Soil plots aren't dense. anchored == 2 means the hoses are screwed in place - if(h && h.anchored==2 && h.density && !(h in connected) && !(h in processing_atoms)) + // 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 @@ -112,6 +121,13 @@ if(myseed && (myseed.loc != src)) myseed.loc = src + if(self_sustaining) + adjustNutri(2 / rating) + adjustWater(rand(8, 10) / rating) + adjustWeeds(-5 / rating) + adjustPests(-5 / rating) + adjustToxic(-5 / rating) + if(world.time > (lastcycle + cycledelay)) lastcycle = world.time if(myseed && !dead) @@ -128,7 +144,7 @@ adjustNutri(-1 / rating) // Lack of nutrients hurts non-weeds - if(nutrilevel <= 0 && myseed.plant_type != PLANT_WEED) + if(nutrilevel <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) adjustHealth(-rand(1,3)) //Photosynthesis///////////////////////////////////////////////////////// @@ -136,7 +152,7 @@ if(isturf(loc)) var/turf/currentTurf = loc var/lightAmt = (currentTurf.get_lumcount() * 10) - if(myseed.plant_type == PLANT_MUSHROOM) + if(myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) if(lightAmt < 2) adjustHealth(-1 / rating) else // Non-mushroom @@ -148,7 +164,7 @@ // var/safe_co2_min = 0.1 //These values are too high, but if they were lower you would barely notice them ASD PLS var/CO2_partialpressure = 0 - if(myseed.plant_type != 2 && isturf(loc)) //Breathe from loc as turf + if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism) && isturf(loc)) //Breathe from loc as turf var/datum/gas_mixture/environment if(loc) environment = loc.return_air() @@ -191,15 +207,17 @@ adjustWater(-rand(1,6) / rating) // If the plant is dry, it loses health pretty fast, unless mushroom - if(waterlevel <= 10 && myseed.plant_type != PLANT_MUSHROOM) + if(waterlevel <= 10 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) adjustHealth(-rand(0,1) / rating) if(waterlevel <= 0) adjustHealth(-rand(0,2) / rating) - // Sufficient water level and nutrient level = plant healthy + // Sufficient water level and nutrient level = plant healthy but also spawns weeds else if(waterlevel > 10 && nutrilevel > 0) adjustHealth(rand(1,2) / rating) - if(prob(5)) //5 percent chance the weed population will increase + if(myseed && prob(myseed.weed_chance)) + adjustWeeds(myseed.weed_rate) + else if(prob(5)) //5 percent chance the weed population will increase adjustWeeds(1 / rating) //Toxins///////////////////////////////////////////////////////////////// @@ -218,13 +236,13 @@ adjustHealth(-1 / rating) // If it's a weed, it doesn't stunt the growth - if(weedlevel >= 5 && myseed.plant_type != PLANT_WEED) + if(weedlevel >= 5 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) adjustHealth(-1 / rating) //Health & Age/////////////////////////////////////////////////////////// - // Plant dies if health <= 0 - if(health <= 0) + // Plant dies if plant_health <= 0 + if(plant_health <= 0) plantdies() adjustWeeds(1 / rating) // Weeds flourish @@ -249,7 +267,7 @@ if(weedlevel >= 10 && prob(50)) // At this point the plant is kind of fucked. Weeds can overtake the plant spot. if(myseed) - if(myseed.plant_type == PLANT_NORMAL) // If a normal plant + if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy) && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) // If a normal plant weedinvasion() else weedinvasion() // Weed invasion into empty tray @@ -282,17 +300,25 @@ //Refreshes the icon and sets the luminosity overlays.Cut() + if(self_sustaining) + if(istype(src, /obj/machinery/hydroponics/soil)) + color = rgb(255, 175, 0) + else + overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "gaia_blessing") + set_light(3) + update_icon_hoses() if(myseed) update_icon_plant() update_icon_lights() - if(myseed && myseed.get_gene(/datum/plant_gene/trait/glow)) - var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow) - set_light(G.get_lum(myseed)) - else - set_light(0) + if(!self_sustaining) + if(myseed && myseed.get_gene(/datum/plant_gene/trait/glow)) + var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow) + set_light(G.get_lum(myseed)) + else + set_light(0) return @@ -302,7 +328,7 @@ for(var/Dir in cardinal) var/obj/machinery/hydroponics/t = locate() in get_step(src,Dir) - if(t && t.anchored == 2 && src.anchored == 2) + if(t && t.using_irrigation && using_irrigation) n += Dir icon_state = "hoses-[n]" @@ -319,7 +345,7 @@ else var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages) I = image('icons/obj/hydroponics/growing.dmi', icon_state = "[myseed.icon_grow][t_growthstate]") - I.layer = MOB_LAYER + 0.1 + I.layer = OBJ_LAYER + 0.01 overlays += I /obj/machinery/hydroponics/proc/update_icon_lights() @@ -327,7 +353,7 @@ overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowwater3") if(nutrilevel <= 2) overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lownutri3") - if(health <= (myseed.endurance / 2)) + if(plant_health <= (myseed.endurance / 2)) overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowhealth3") if(weedlevel >= 5 || pestlevel >= 5 || toxic >= 40) overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_alert3") @@ -343,13 +369,16 @@ user << "It's dead." else if (harvest) user << "It's ready to harvest." - else if (health <= (myseed.endurance / 2)) + else if (plant_health <= (myseed.endurance / 2)) user << "It looks unhealthy." else user << "[src] is empty." - user << "Water: [waterlevel]/[maxwater]" - user << "Nutrient: [nutrilevel]/[maxnutri]" + if(!self_sustaining) + user << "Water: [waterlevel]/[maxwater]" + user << "Nutrient: [nutrilevel]/[maxnutri]" + else + user << "It doesn't require any maintenance." if(weedlevel >= 5) user << "[src] is filled with weeds!" @@ -385,22 +414,22 @@ else myseed = new /obj/item/seeds/weeds(src) age = 0 - health = myseed.endurance + plant_health = myseed.endurance lastcycle = world.time harvest = 0 weedlevel = 0 // Reset pestlevel = 0 // Reset update_icon() - visible_message("[oldPlantName] overtaken by [myseed.plantname].") + visible_message("The [oldPlantName] is overtaken by some [myseed.plantname]!") -/obj/machinery/hydroponics/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25) // Mutates the current seed +/obj/machinery/hydroponics/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0) // Mutates the current seed if(!myseed) return - myseed.mutate(lifemut, endmut, productmut, yieldmut, potmut) + myseed.mutate(lifemut, endmut, productmut, yieldmut, potmut, wrmut, wcmut, traitmut) /obj/machinery/hydroponics/proc/hardmutate() - mutate(4, 10, 2, 4, 50) + mutate(4, 10, 2, 4, 50, 4, 10, 3) /obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant! @@ -418,7 +447,7 @@ hardmutate() age = 0 - health = myseed.endurance + plant_health = myseed.endurance lastcycle = world.time harvest = 0 weedlevel = 0 // Reset @@ -438,7 +467,7 @@ dead = 0 hardmutate() age = 0 - health = myseed.endurance + plant_health = myseed.endurance lastcycle = world.time harvest = 0 weedlevel = 0 // Reset @@ -451,7 +480,7 @@ /obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one function to make things easier - health = 0 + plant_health = 0 harvest = 0 pestlevel = 0 // Pests die if(!dead) @@ -645,6 +674,20 @@ adjustHealth(round(S.get_reagent_amount("nutriment") * 0.5)) adjustNutri(round(S.get_reagent_amount("nutriment") * 1)) + // Compost for EVERYTHING + if(S.has_reagent("virusfood", 1)) + adjustNutri(round(S.get_reagent_amount("virusfood") * 0.5)) + adjustHealth(-round(S.get_reagent_amount("virusfood") * 0.5)) + + // FEED ME + if(S.has_reagent("blood", 1)) + adjustNutri(round(S.get_reagent_amount("blood") * 1)) + adjustPests(rand(2,4)) + + // FEED ME SEYMOUR + if(S.has_reagent("strangereagent", 1)) + spawnplant() + // The best stuff there is. For testing/debugging. if(S.has_reagent("adminordrazine", 1)) adjustWater(round(S.get_reagent_amount("adminordrazine") * 1)) @@ -662,13 +705,27 @@ /obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, params) //Called when mob user "attacks" it with object O - if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too) + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia)) //Checked early on so it doesn't have to deal with composting checks + if(self_sustaining) + user << "This [name] is already self-sustaining!" + return + if(myseed || weedlevel) + user << "[src] needs to be clear of plants and weeds!" + return + user.visible_message("[user] gently pulls open the soil for [O] and places it inside.", "You tenderly root [O] into [src].") + user.drop_item() + qdel(O) + visible_message("[src] begins to glow with a beautiful light!") + self_sustaining = TRUE + update_icon() + + else if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too) var/obj/item/weapon/reagent_containers/reagent_source = O if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe)) var/obj/item/weapon/reagent_containers/syringe/syr = reagent_source if(syr.mode != 1) - user << "You can't get any extract out of this plant." //That. Gives me an idea... + user << "You can't get any extract out of this plant." //That. Gives me an idea... return if(!reagent_source.reagents.total_volume) @@ -699,8 +756,7 @@ if(istype(reagent_source, /obj/item/weapon/reagent_containers/glass/)) playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - // anchored == 2 means the hoses are screwed in place - if(irrigate && reagent_source.amount_per_transfer_from_this > 30 && reagent_source.reagents.total_volume >= 30 && anchored == 2) + if(irrigate && reagent_source.amount_per_transfer_from_this > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation) trays = FindConnected() if (trays.len > 1) visi_msg += ", setting off the irrigation system" @@ -713,7 +769,7 @@ 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() + 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) @@ -723,20 +779,22 @@ H.applyChemicals(S) S.clear_reagents() - del(S) + qdel(S) H.update_icon() if(reagent_source) // If the source wasn't composted and destroyed reagent_source.update_icon() return 1 - else if(istype(O, /obj/item/seeds)) + else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample)) if(!myseed) + if(istype(O, /obj/item/seeds/kudzu)) + investigate_log("had Kudzu planted in it by [user.ckey]([user]) at ([x],[y],[z])","kudzu") user.unEquip(O) - user << "You plant [O]." + user << "You plant [O]." dead = 0 myseed = O age = 1 - health = myseed.endurance + plant_health = myseed.endurance lastcycle = world.time O.loc = src update_icon() @@ -766,7 +824,7 @@ weedlevel = 0 update_icon() else - user << "This plot is completely devoid of weeds. It doesn't need uprooting." + user << "This plot is completely devoid of weeds! It doesn't need uprooting." else if(istype(O, /obj/item/weapon/storage/bag/plants)) attack_hand(user) @@ -777,8 +835,8 @@ S.handle_item_insertion(G, 1) else if(istype(O, /obj/item/weapon/wrench) && unwrenchable) - if(anchored == 2) - user << "Unscrew the hoses first!" + if(using_irrigation) + user << "Unscrew the hoses first!" return if(!anchored && !isinspace()) @@ -802,24 +860,32 @@ user.visible_message("[user] unwrenches [src].", \ "You unwrench [src].") - else if(istype(O, /obj/item/weapon/wirecutters) && unwrenchable) //THIS NEED TO BE DONE DIFFERENTLY, SOMEONE REFACTOR THE TRAY CODE ALREADY - if(anchored) - if(anchored == 2) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - anchored = 1 - user << "You snip \the [src]'s hoses." - - else if(anchored == 1) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - anchored = 2 - user << "You reconnect \the [src]'s hoses." - - for(var/obj/machinery/hydroponics/h in range(1,src)) - spawn() - h.update_icon() - - return + else if(istype(O, /obj/item/weapon/wirecutters) && unwrenchable) + using_irrigation = !using_irrigation + playsound(src, 'sound/items/Wirecutter.ogg', 50, 1) + 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/weapon/shovel/spade) && unwrenchable) + if(!myseed && !weedlevel) + user << "[src] doesn't have any plants or weeds!" + return + user.visible_message("[user] starts digging out [src]'s plants...", "You start digging out [src]'s plants...") + playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) + if(!do_after(user, 50, target = src) || (!myseed && !weedlevel)) + return + user.visible_message("[user] digs out the plants in [src]!", "You dig out all of [src]'s plants!") + playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) + if(myseed) //Could be that they're just using it as a de-weeder + qdel(myseed) + myseed = null + weedlevel = 0 //Side-effect of cleaning up those nasty weeds + update_icon() + else + return ..() /obj/machinery/hydroponics/attack_hand(mob/user as mob) if(istype(user, /mob/living/silicon) && !ismommi(user)) //How does AI know what plant is? //why the fuck didn't this nig use issilicon() @@ -828,7 +894,7 @@ myseed.harvest() else if(dead) dead = 0 - user << "You remove the dead plant from [src]." + user << "You remove the dead plant from [src]." qdel(myseed) myseed = null update_icon() @@ -838,14 +904,14 @@ /obj/machinery/hydroponics/proc/update_tray(mob/user = usr) harvest = 0 lastproduce = age - if(istype(myseed,/obj/item/seeds/replicapod/)) - user << "You harvest from the [myseed.plantname]." + if(istype(myseed,/obj/item/seeds/replicapod)) + user << "You harvest from the [myseed.plantname]." else if(myseed.getYield() <= 0) - user << "You fail to harvest anything useful." + user << "You fail to harvest anything useful!" playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 0) else - user << "You harvest [myseed.getYield()] items from the [myseed.plantname]." - if(myseed.oneharvest) + 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 @@ -863,7 +929,7 @@ /obj/machinery/hydroponics/proc/adjustHealth(adjustamt) if(myseed && !dead) - health = Clamp(health + adjustamt, 0, myseed.endurance) + plant_health = Clamp(plant_health + adjustamt, 0, myseed.endurance) /obj/machinery/hydroponics/proc/adjustToxic(adjustamt) toxic = Clamp(toxic + adjustamt, 0, 100) @@ -880,6 +946,7 @@ var/mob/living/simple_animal/hostile/C = new chosen C.faction = list("plants") + /////////////////////////////////////////////////////////////////////////////// /obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk! name = "soil" @@ -896,7 +963,8 @@ return // Has no lights /obj/machinery/hydroponics/soil/attackby(obj/item/O, mob/user, params) - ..() - if(istype(O, /obj/item/weapon/shovel)) + if(istype(O, /obj/item/weapon/shovel) && !istype(O, /obj/item/weapon/shovel/spade)) user << "You clear up [src]!" - qdel(src) \ No newline at end of file + qdel(src) + else + return ..() diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 3dbb809313939..eabbb540f68f3 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -78,6 +78,22 @@ S.potency = value +/datum/plant_gene/core/weed_rate + name = "Weed Growth Rate" + value = 1 + +/datum/plant_gene/core/weed_rate/apply_stat(obj/item/seeds/S) + S.weed_rate = value + + +/datum/plant_gene/core/weed_chance + name = "Weed Vulnerability" + value = 5 + +/datum/plant_gene/core/weed_chance/apply_stat(obj/item/seeds/S) + S.weed_chance = value + + // Reagent genes store reagent ID and reagent ratio. Amount of reagent in the plant = 1 + (potency * rate) /datum/plant_gene/reagent name = "Nutriment" @@ -141,27 +157,34 @@ return TRUE /datum/plant_gene/trait/proc/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc) - if(origin_tech) // This ugly code segment adds RnD tech levels to resulting plants. - if(G.origin_tech) - var/list/tech = params2list(G.origin_tech) - for(var/t in origin_tech) - if(t in tech) - tech[t] = max(tech[t], origin_tech[t]) - else - tech[t] = origin_tech[t] - G.origin_tech = list2params(tech) - else - G.origin_tech = list2params(origin_tech) - return + if(!origin_tech) // This ugly code segment adds RnD tech levels to resulting plants. + return + + if(G.origin_tech) + var/list/tech = params2list(G.origin_tech) + for(var/t in origin_tech) + if(t in tech) + tech[t] = max(text2num(tech[t]), origin_tech[t]) + else + tech[t] = origin_tech[t] + G.origin_tech = list2params(tech) + else + G.origin_tech = list2params(origin_tech) /datum/plant_gene/trait/proc/on_consume(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target) return +/datum/plant_gene/trait/proc/on_cross(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target) + return /datum/plant_gene/trait/proc/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target) return /datum/plant_gene/trait/proc/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target) return +/datum/plant_gene/trait/proc/on_attackby(obj/item/weapon/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user) + return +/datum/plant_gene/trait/proc/on_throw_impact(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target) + return /datum/plant_gene/trait/squash // Allows the plant to be squashed when thrown or slipped on, leaving a colored mess and trash type item behind. @@ -170,8 +193,8 @@ name = "Liquid Contents" examine_line = "It has a lot of liquid contents inside." -/*/datum/plant_gene/trait/squash/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target) - G.squash(target)*/ +/datum/plant_gene/trait/squash/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target) + G.squash(target) /datum/plant_gene/trait/slip @@ -182,6 +205,24 @@ rate = 0.1 examine_line = "It has a very slippery skin." +/datum/plant_gene/trait/slip/on_cross(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target) + if(iscarbon(target)) + var/obj/item/seeds/seed = G.seed + var/mob/living/carbon/M = target + + var/stun_len = seed.potency * rate * 0.8 + if(istype(G) && ispath(G.trash, /obj/item/weapon/grown)) + return + + if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube"))) + stun_len /= 3 + + var/stun = min(stun_len, 7) + var/weaken = min(stun_len, 7) + + if(M.slip(stun, weaken, G)) + for(var/datum/plant_gene/trait/T in seed.genes) + T.on_slip(G, M) /datum/plant_gene/trait/cell_charge // Cell recharging trait. Charges all mob's power cells to (potency*rate)% mark when eaten. @@ -290,4 +331,80 @@ /datum/plant_gene/trait/maxchem/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc) ..() - G.reagents.maximum_volume *= rate \ No newline at end of file + G.reagents.maximum_volume *= rate + +/datum/plant_gene/trait/repeated_harvest + name = "perennial growth" + +/datum/plant_gene/trait/repeated_harvest/can_add(obj/item/seeds/S) + if(!..()) + return FALSE + if(istype(S, /obj/item/seeds/replicapod)) + return FALSE + return TRUE + +/datum/plant_gene/trait/battery + name = "capacitive cellular production" + +/datum/plant_gene/trait/battery/on_attackby(obj/item/weapon/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user) + if(istype(I, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = I + if(C.use(5)) + user << "You add some cable to [G] and slide it inside the battery encasing." + var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(user.loc) + pocell.icon_state = G.icon_state + pocell.maxcharge = G.seed.potency * 20 + + // The secret of potato supercells! + var/datum/plant_gene/trait/cell_charge/CG = G.seed.get_gene(/datum/plant_gene/trait/cell_charge) + if(CG) // 10x charge for deafult cell charge gene - 20 000 with 100 potency. + pocell.maxcharge *= CG.rate*1000 + pocell.charge = pocell.maxcharge + pocell.name = "[G] battery" + pocell.desc = "A rechargable plant based power cell. This one has a power rating of [pocell.maxcharge], and you should not swallow it." + + if(G.reagents.has_reagent("plasma", 2)) + pocell.rigged = 1 + + qdel(G) + else + user << "You need five lengths of cable to make a [G] battery!" + + +/datum/plant_gene/trait/stinging + name = "hypodermic prickles" + +/datum/plant_gene/trait/stinging/on_throw_impact(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target) + if(isliving(target) && G.reagents && G.reagents.total_volume) + var/mob/living/L = target + if(L.reagents && L.can_inject(null, 0)) + var/injecting_amount = max(1, G.seed.potency*0.2) // Minimum of 1, max of 20 + var/fraction = min(injecting_amount/G.reagents.total_volume, 1) + G.reagents.reaction(L, fraction) + G.reagents.trans_to(L, injecting_amount) + target << "You are pricked by [G]!" + +/datum/plant_gene/trait/smoke + name = "gaseous decomposition" + +/datum/plant_gene/trait/smoke/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target) + var/datum/effect/effect/system/smoke_spread/chem/S = new + var/splat_location = get_turf(target) + var/smoke_amount = round(sqrt(G.seed.potency * 0.1), 1) + S.attach(splat_location) + S.set_up(G.reagents, smoke_amount, splat_location, 0) + S.start() + G.reagents.clear_reagents() + +/datum/plant_gene/trait/plant_type // Parent type + name = "you shouldn't see this" + trait_id = "plant_type" + +/datum/plant_gene/trait/plant_type/weed_hardy + name = "Robust Species" + +/datum/plant_gene/trait/plant_type/fungal_metabolism + name = "Fungal Vitality" + +/datum/plant_gene/trait/plant_type/alien_properties + name ="?????" \ No newline at end of file diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 9e12ba81932d1..29e1f30197a5e 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -20,10 +20,8 @@ var/maturation = 6 // Used to determine which sprite to switch to when growing. var/production = 6 // Changes the amount of time needed for a plant to become harvestable. var/yield = 3 // Amount of growns created per harvest. If is -1, the plant/shroom/weed is never meant to be harvested. - var/oneharvest = 0 // If a plant is cleared from the tray after harvesting, e.g. a carrot. 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/plant_type = PLANT_NORMAL // 0 = PLANT_NORMAL; 1 = PLANT_WEED; 2 = PLANT_MUSHROOM; 3 = PLANT_ALIEN 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. @@ -33,6 +31,8 @@ // Stronger reagents must always come first to avoid being displaced by weaker ones. // Total amount of any reagent in plant is calculated by formula: 1 + round(potency * multiplier) + 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 /obj/item/seeds/New(loc, nogenes = 0) ..() @@ -45,12 +45,14 @@ if(!icon_dead) icon_dead = "[species]-dead" - if(!icon_harvest && plant_type != PLANT_MUSHROOM && yield != -1) + if(!icon_harvest && !get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism) && yield != -1) icon_harvest = "[species]-harvest" if(!nogenes) // not used on Copy() genes += new /datum/plant_gene/core/lifespan(lifespan) genes += new /datum/plant_gene/core/endurance(endurance) + genes += new /datum/plant_gene/core/weed_rate(weed_rate) + genes += new /datum/plant_gene/core/weed_chance(weed_chance) if(yield != -1) genes += new /datum/plant_gene/core/yield(yield) genes += new /datum/plant_gene/core/production(production) @@ -74,6 +76,8 @@ S.production = production S.yield = yield S.potency = potency + S.weed_rate = weed_rate + S.weed_chance = weed_chance S.genes = list() for(var/g in genes) var/datum/plant_gene/G = g @@ -89,12 +93,17 @@ for(var/datum/plant_gene/reagent/R in genes) reagents_add[R.reagent_id] = R.rate -/obj/item/seeds/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25) +/obj/item/seeds/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0) 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_weed_rate(rand(-wrmut, wrmut)) + adjust_weed_chance(rand(-wcmut, wcmut)) + if(prob(traitmut)) + add_random_traits(1, 1) + /obj/item/seeds/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables. @@ -122,7 +131,7 @@ if(parent.yieldmod == 0) return_yield = min(return_yield, 1)//1 if above zero, 0 otherwise else - return_yield *= parent.yieldmod + return_yield *= (parent.yieldmod) return return_yield @@ -161,45 +170,111 @@ if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable yield = Clamp(yield + adjustamt, 0, 10) - if(yield <= 0 && plant_type == PLANT_MUSHROOM) + if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) yield = 1 // Mushrooms always have a minimum yield of 1. var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/yield) - C.value = yield + if(C) + C.value = yield /obj/item/seeds/proc/adjust_lifespan(adjustamt) lifespan = Clamp(lifespan + adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan) - C.value = lifespan + if(C) + C.value = lifespan /obj/item/seeds/proc/adjust_endurance(adjustamt) endurance = Clamp(endurance + adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance) - C.value = endurance + if(C) + C.value = endurance /obj/item/seeds/proc/adjust_production(adjustamt) if(yield != -1) production = Clamp(production + adjustamt, 2, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production) - C.value = production + if(C) + C.value = production /obj/item/seeds/proc/adjust_potency(adjustamt) if(potency != -1) potency = Clamp(potency + adjustamt, 0, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency) - C.value = potency + if(C) + C.value = potency + +/obj/item/seeds/proc/adjust_weed_rate(adjustamt) + weed_rate = Clamp(weed_rate + adjustamt, 0, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) + if(C) + C.value = weed_rate + +/obj/item/seeds/proc/adjust_weed_chance(adjustamt) + weed_chance = Clamp(weed_chance + adjustamt, 0, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance) + if(C) + C.value = weed_chance + +//Directly setting stats + +/obj/item/seeds/proc/set_yield(adjustamt) + if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable + yield = Clamp(adjustamt, 0, 10) + + if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) + yield = 1 // Mushrooms always have a minimum yield of 1. + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/yield) + if(C) + C.value = yield + +/obj/item/seeds/proc/set_lifespan(adjustamt) + lifespan = Clamp(adjustamt, 10, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan) + if(C) + C.value = lifespan + +/obj/item/seeds/proc/set_endurance(adjustamt) + endurance = Clamp(adjustamt, 10, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance) + if(C) + C.value = endurance + +/obj/item/seeds/proc/set_production(adjustamt) + if(yield != -1) + production = Clamp(adjustamt, 2, 10) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production) + if(C) + C.value = production + +/obj/item/seeds/proc/set_potency(adjustamt) + if(potency != -1) + potency = Clamp(adjustamt, 0, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency) + if(C) + C.value = potency + +/obj/item/seeds/proc/set_weed_rate(adjustamt) + weed_rate = Clamp(adjustamt, 0, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) + if(C) + C.value = weed_rate + +/obj/item/seeds/proc/set_weed_chance(adjustamt) + weed_chance = Clamp(adjustamt, 0, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance) + if(C) + C.value = weed_chance /obj/item/seeds/proc/get_analyzer_text() //in case seeds have something special to tell to the analyzer var/text = "" - switch(plant_type) - if(PLANT_NORMAL) - text += "- Plant type: Normal plant\n" - if(PLANT_WEED) - text += "- Plant type: Weed. Can grow in nutrient-poor soil.\n" - if(PLANT_MUSHROOM) - text += "- Plant type: Mushroom. Can grow in dry soil.\n" - else - text += "- Plant type: UNKNOWN \n" + if(!get_gene(/datum/plant_gene/trait/plant_type/weed_hardy) && !get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism) && !get_gene(/datum/plant_gene/trait/plant_type/alien_properties)) + text += "- Plant type: Normal plant\n" + if(get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) + text += "- Plant type: Weed. Can grow in nutrient-poor soil.\n" + if(get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) + text += "- Plant type: Mushroom. Can grow in dry soil.\n" + if(get_gene(/datum/plant_gene/trait/plant_type/alien_properties)) + text += "- Plant type: UNKNOWN \n" if(potency != -1) text += "- Potency: [potency]\n" if(yield != -1) @@ -209,6 +284,8 @@ text += "- Production speed: [production]\n" text += "- Endurance: [endurance]\n" text += "- Lifespan: [lifespan]\n" + text += "- Weed Growth Rate: [weed_rate]\n" + text += "- Weed Vulnerability: [weed_chance]\n" if(rarity) text += "- Species Discovery Value: [rarity]\n" @@ -239,7 +316,7 @@ // Maybe some day it would be used as unit test. /proc/check_plants_growth_stages_icons() var/list/states = icon_states('icons/obj/hydroponics/growing.dmi') - var/list/paths = typesof(/obj/item/seeds) - /obj/item/seeds + var/list/paths = typesof(/obj/item/seeds) - /obj/item/seeds - typesof(/obj/item/seeds/sample) for(var/seedpath in paths) var/obj/item/seeds/seed = new seedpath @@ -254,4 +331,44 @@ if(seed.icon_harvest) // mushrooms have no grown sprites, same for items with no product if(!(seed.icon_harvest in states)) - world << "[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!" \ No newline at end of file + world << "[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!" + +/obj/item/seeds/proc/randomize_stats() + set_lifespan(rand(25, 60)) + set_endurance(rand(15, 35)) + set_production(rand(2, 10)) + set_yield(rand(1, 10)) + set_potency(rand(10, 35)) + set_weed_rate(rand(1, 10)) + set_weed_chance(rand(5, 100)) + maturation = rand(6, 12) + +/obj/item/seeds/proc/add_random_reagents(lower = 0, upper = 2) + var/amount_random_reagents = rand(lower, upper) + for(var/i in 1 to amount_random_reagents) + var/random_amount = rand(4, 15) * 0.01 // this must be multiplied by 0.01, otherwise, it will not properly associate + var/datum/plant_gene/reagent/R = new(get_random_reagent_id(), random_amount) + if(R.can_add(src)) + genes += R + else + qdel(R) + reagents_from_genes() + +/obj/item/seeds/proc/add_random_traits(lower = 0, upper = 2) + var/amount_random_traits = rand(lower, upper) + for(var/i in 1 to amount_random_traits) + var/random_trait = pick((subtypesof(/datum/plant_gene/trait)-typesof(/datum/plant_gene/trait/plant_type))) + var/datum/plant_gene/trait/T = new random_trait + if(T.can_add(src)) + genes += T + else + qdel(T) + +/obj/item/seeds/proc/add_random_plant_type(normal_plant_chance = 75) + if(prob(normal_plant_chance)) + var/random_plant_type = pick(subtypesof(/datum/plant_gene/trait/plant_type)) + var/datum/plant_gene/trait/plant_type/P = new random_plant_type + if(P.can_add(src)) + genes += P + else + qdel(P) \ No newline at end of file diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index d0e1b76b53811..7b520c9101580 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -20,7 +20,7 @@ var/rigged = 0 // true if rigged to explode var/minor_fault = 0 //If not 100% reliable, it will build up faults. var/chargerate = 100 //how much power is given every tick in a recharger - + var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it. /obj/item/weapon/stock_parts/cell/suicide_act(mob/user) user.visible_message("[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide.") return (FIRELOSS) @@ -35,7 +35,8 @@ /obj/item/weapon/stock_parts/cell/proc/updateicon() overlays.Cut() - + if(grown_battery) + overlays += (image('icons/obj/power.dmi', "grown_wires")) if(charge < 0.01) return else if(charge/maxcharge >=0.995) @@ -283,13 +284,14 @@ name = "potato battery" desc = "A rechargable starch based power cell." origin_tech = "powerstorage=1" - icon = 'icons/obj/power.dmi' //'icons/obj/hydroponics/harvest.dmi' - icon_state = "potato_cell" //"potato_battery" + icon = 'icons/obj/hydroponics/harvest.dmi' + icon_state = "potato" charge = 100 maxcharge = 300 materials = list() minor_fault = 1 rating = 1 + grown_battery = TRUE //it has the overlays for wires /obj/item/weapon/stock_parts/cell/high/slime name = "charged slime core" diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 3eedda35b659b..02fcd3cd0bb00 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -624,3 +624,13 @@ var/const/PATCH = 4 //patches qdel(reagents) reagents = new/datum/reagents(max_vol) reagents.my_atom = src + +/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents + var/static/list/random_reagents = list() + if(!random_reagents.len) + for(var/thing in subtypesof(/datum/reagent)) + var/datum/reagent/R = thing + if(initial(R.can_synth)) + random_reagents += initial(R.id) + var/picked_reagent = pick(random_reagents) + return picked_reagent \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 2ef0a9e741001..193757b93161b 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -110,5 +110,4 @@ /datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob) if(prob(30)) M << "You're not feeling good at all! You really need some [name]." - return - + return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm index 92889a4e40092..c57757d338086 100644 --- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm @@ -1060,3 +1060,29 @@ M.reagents.remove_reagent("sugar", 3) ..() return + +/datum/reagent/medicine/earthsblood + name = "Earthsblood" + id = "earthsblood" + description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain." + color = rgb(255, 175, 0) + overdose_threshold = 25 + +/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/M) + M.adjustBruteLoss(-3 * REM, 0) + M.adjustFireLoss(-3 * REM, 0) + M.adjustOxyLoss(-15 * REM, 0) + M.adjustToxLoss(-3 * REM, 0) + M.adjustBrainLoss(0.5 * REM) //This does, after all, come from ambrosia + M.adjustCloneLoss(-1 * REM, 0) + M.adjustStaminaLoss(-30 * REM, 0) + M.jitteriness = min(max(0, M.jitteriness + 3), 30) + M.druggy = min(max(0, M.druggy + 3), 15) //See above + ..() + . = 1 + +/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M) + M.hallucination = min(max(0, M.hallucination + 10), 50) + M.adjustToxLoss(5 * REM, 0) + ..() + . = 1 diff --git a/goon/icons/obj/hydroponics.dmi b/goon/icons/obj/hydroponics.dmi new file mode 100644 index 0000000000000..1b2a0a583d598 Binary files /dev/null and b/goon/icons/obj/hydroponics.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 542ba172208eb..3165c60ff0784 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi index 9b35f0851ad36..30ec6589dba30 100644 Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi index 7d0a8e56059d3..c91c84e28eff9 100644 Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index 482f07dba4fd6..0b55e2e86523c 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index c82f15e3012f2..8c6fb16b531d0 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 68ba83418e3c7..4fefb18a9b481 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/sound/effects/fuse.ogg b/sound/effects/fuse.ogg new file mode 100644 index 0000000000000..a1a7ba368f858 Binary files /dev/null and b/sound/effects/fuse.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 6082730afeaf2..5359ed0bdcb6e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1109,6 +1109,7 @@ #include "code\modules\hydroponics\grown\banana.dm" #include "code\modules\hydroponics\grown\beans.dm" #include "code\modules\hydroponics\grown\berries.dm" +#include "code\modules\hydroponics\grown\cannabis.dm" #include "code\modules\hydroponics\grown\cereals.dm" #include "code\modules\hydroponics\grown\chili.dm" #include "code\modules\hydroponics\grown\citrus.dm" @@ -1124,6 +1125,7 @@ #include "code\modules\hydroponics\grown\nettle.dm" #include "code\modules\hydroponics\grown\potato.dm" #include "code\modules\hydroponics\grown\pumpkin.dm" +#include "code\modules\hydroponics\grown\random.dm" #include "code\modules\hydroponics\grown\replicapod.dm" #include "code\modules\hydroponics\grown\root.dm" #include "code\modules\hydroponics\grown\tea_coffee.dm"