diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index 0d8cee8dff4..f57c8be9816 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -182,6 +182,14 @@
SSobj.burning -= src
qdel(src)
+/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/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm
index f58fbb91f7f..dc810aba585 100644
--- a/code/modules/hydroponics/grown/ambrosia.dm
+++ b/code/modules/hydroponics/grown/ambrosia.dm
@@ -38,7 +38,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
@@ -49,3 +49,25 @@
icon_state = "ambrosiadeus"
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
+ oneharvest = TRUE
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia
+ name = "ambrosia gaia"
+ desc = "The bringer of light."
+ 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/berries.dm b/code/modules/hydroponics/grown/berries.dm
index 36592c1571d..9398dca79df 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -122,7 +122,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
@@ -134,6 +134,49 @@
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()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/burn()
+ prime()
+ ..()
+
+/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)
+ sleep(30)
+ if(!src)
+ return
+ var/d_strength = round(seed.potency / 100)
+ var/h_strength = round(seed.potency / 50)
+ var/l_strength = round(seed.potency / 20)
+ var/f_strength = l_strength
+ explosion(get_turf(src), d_strength, h_strength, l_strength, f_strength)
+ qdel(src)
// Grapes
/obj/item/seeds/grape
diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm
index 8b6274c4e09..5db9902b766 100644
--- a/code/modules/hydroponics/grown/cereals.dm
+++ b/code/modules/hydroponics/grown/cereals.dm
@@ -11,7 +11,7 @@
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 +60,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/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 2b3aa6b83b1..7bd1f28c135 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)
@@ -24,6 +24,8 @@
var/rating = 1
var/unwrenchable = 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
@@ -77,7 +79,7 @@
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
@@ -92,8 +94,8 @@
var/atom/a = processing_atoms[1]
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
@@ -118,6 +120,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)
@@ -243,17 +252,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")
+ SetLuminosity(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)
- SetLuminosity(G.get_lum(myseed))
- else
- SetLuminosity(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)
+ SetLuminosity(G.get_lum(myseed))
+ else
+ SetLuminosity(0)
return
@@ -261,7 +278,7 @@
var/n = 0
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]"
@@ -307,8 +324,11 @@
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!"
@@ -651,7 +671,23 @@
/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, 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
+ if(alert(user, "This will make [src] self-sustaining but consume [O] forever. Are you sure?", "[name]", "I'm Sure", "Abort") == "Abort" || !user)
+ 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))
@@ -688,8 +724,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"
@@ -702,7 +737,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)
@@ -767,7 +802,7 @@
S.handle_item_insertion(G, 1)
else if(istype(O, /obj/item/weapon/wrench) && unwrenchable)
- if(anchored == 2)
+ if(using_irrigation)
user << "Unscrew the hoses first!"
return
@@ -792,20 +827,30 @@
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(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(anchored == 1)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
- anchored = 2
- user << "You reconnect \the [src]'s hoses."
+ 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()
- for(var/obj/machinery/hydroponics/h in range(1,src))
- h.update_icon()
else
return ..()
@@ -884,7 +929,7 @@
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)
else
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 1b5ad721edf..398399f6b7a 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -128,7 +128,7 @@ var/const/INJECT = 5 //injection
return id
/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
- if(!target )
+ if(!target || !total_volume)
return
var/datum/reagents/R
if(istype(target, /datum/reagents))
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 54e4340d690..7d5fe115568 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1003,6 +1003,32 @@ datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/M)
..()
. = 1
+/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
+
/datum/reagent/medicine/haloperidol
name = "Haloperidol"
id = "haloperidol"
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index a41f6186a9c..3165c60ff07 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 62fdde98c3e..558e0f62509 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 0d7745b22d2..98591dc81f9 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 40ea8a4df70..0b55e2e8652 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 c82f15e3012..379f30fce8d 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/sound/effects/fuse.ogg b/sound/effects/fuse.ogg
new file mode 100644
index 00000000000..a1a7ba368f8
Binary files /dev/null and b/sound/effects/fuse.ogg differ