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