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"