diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm
index 60f99c4c..c04e9406 100644
--- a/code/__DEFINES/food.dm
+++ b/code/__DEFINES/food.dm
@@ -13,6 +13,7 @@
#define PINEAPPLE (1<<12)
#define BREAKFAST (1<<13)
#define CLOTH (1<<14)
+#define ANTITOXIC (1<<15)
#define DRINK_NICE 1
#define DRINK_GOOD 2
diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm
index df03918c..e9133244 100644
--- a/code/datums/components/anti_magic.dm
+++ b/code/datums/components/anti_magic.dm
@@ -1,26 +1,42 @@
/datum/component/anti_magic
var/magic = FALSE
var/holy = FALSE
+ var/psychic = FALSE
+ var/charges = INFINITY
+ var/blocks_self = TRUE
+ var/datum/callback/reaction
+ var/datum/callback/expire
-/datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE)
+/datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE, _psychic = FALSE, _charges, _blocks_self = TRUE, datum/callback/_reaction, datum/callback/_expire)
if(isitem(parent))
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop)
else if(ismob(parent))
- RegisterSignal(parent, COMSIG_MOB_RECEIVE_MAGIC, .proc/can_protect)
+ RegisterSignal(parent, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect)
else
return COMPONENT_INCOMPATIBLE
magic = _magic
holy = _holy
+ psychic = _psychic
+ if(!isnull(_charges))
+ charges = _charges
+ blocks_self = _blocks_self
+ reaction = _reaction
+ expire = _expire
/datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot)
- RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/can_protect, TRUE)
+ RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect, TRUE)
/datum/component/anti_magic/proc/on_drop(datum/source, mob/user)
UnregisterSignal(user, COMSIG_MOB_RECEIVE_MAGIC)
-/datum/component/anti_magic/proc/can_protect(datum/source, _magic, _holy, list/protection_sources)
- if((_magic && magic) || (_holy && holy))
+/datum/component/anti_magic/proc/protect(datum/source, mob/user, _magic, _holy, _psychic, chargecost = 1, self, list/protection_sources)
+ if(((_magic && magic) || (_holy && holy) || (_psychic && psychic)) && (!self || blocks_self))
protection_sources += parent
+ reaction?.Invoke(user, chargecost)
+ charges -= chargecost
+ if(charges <= 0)
+ expire?.Invoke(user)
+ qdel(src)
return COMPONENT_BLOCK_MAGIC
diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm
index 845fc433..e7de4e6a 100644
--- a/code/game/objects/items/stacks/cash.dm
+++ b/code/game/objects/items/stacks/cash.dm
@@ -11,6 +11,7 @@
w_class = WEIGHT_CLASS_TINY
full_w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
+ grind_results = list(/datum/reagent/cellulose = 10)
var/value = 0
/obj/item/stack/spacecash/Initialize()
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index cc044c18..987f8580 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -142,6 +142,7 @@
stop_bleeding = 1800
self_delay = 20
max_amount = 12
+ grind_results = list(/datum/reagent/cellulose = 3)
/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params)
@@ -190,3 +191,16 @@
/obj/item/stack/medical/get_belt_overlay()
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch")
+
+/obj/item/stack/medical/aloe
+ name = "aloe cream"
+ desc = "A healing paste you can apply on wounds."
+
+ icon_state = "aloe_paste"
+ self_delay = 25
+ novariants = TRUE
+ amount = 20
+ max_amount = 20
+ heal_brute = 25
+ heal_burn = 30
+ grind_results = list(/datum/reagent/consumable/aloejuice = 1)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 29e1a000..4cfeb324 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -244,7 +244,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/mineral/wood
novariants = TRUE
- grind_results = list(/datum/reagent/carbon = 20)
+ grind_results = list(/datum/reagent/cellulose = 10)
/obj/item/stack/sheet/mineral/wood/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.wood_recipes
@@ -274,7 +274,7 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/mineral/bamboo
- grind_results = list(/datum/reagent/carbon = 5)
+ grind_results = list(/datum/reagent/cellulose = 10)
/obj/item/stack/sheet/mineral/wood/attackby(obj/item/W, mob/user, params) // NOTE: sheet_types.dm is where the WOOD stack lives. Maybe move this over there.
// Taken from /obj/item/stack/rods/attackby in [rods.dm]
@@ -353,6 +353,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
is_fabric = TRUE
loom_result = /obj/item/stack/sheet/silk
merge_type = /obj/item/stack/sheet/cloth
+ grind_results = list(/datum/reagent/cellulose = 4)
/obj/item/stack/sheet/cloth/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.cloth_recipes
@@ -372,6 +373,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
item_state = "sheet-cloth"
novariants = TRUE
merge_type = /obj/item/stack/sheet/silk
+ grind_results = list(/datum/reagent/cellulose = 2)
//obj/item/stack/sheet/silk/Initialize(mapload, new_amount, merge = TRUE)
// recipes = GLOB.silk_recipes
@@ -396,6 +398,7 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/durathread
+ grind_results = list(/datum/reagent/cellulose = 10)
/obj/item/stack/sheet/durathread/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.durathread_recipes
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index f035bff0..d371db96 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -82,6 +82,55 @@
item_state = "tile-fairygrass"
turf_type = /turf/open/floor/grass/fairy
resistance_flags = FLAMMABLE
+ color = "#33CCFF"
+
+/obj/item/stack/tile/fairygrass/white
+ name = "white fairygrass tile"
+ singular_name = "white fairygrass floor tile"
+ desc = "A patch of odd, glowing white grass."
+ turf_type = /turf/open/floor/grass/fairy/white
+ color = "#FFFFFF"
+
+/obj/item/stack/tile/fairygrass/red
+ name = "red fairygrass tile"
+ singular_name = "red fairygrass floor tile"
+ desc = "A patch of odd, glowing red grass."
+ turf_type = /turf/open/floor/grass/fairy/red
+ color = "#FF3333"
+
+/obj/item/stack/tile/fairygrass/yellow
+ name = "yellow fairygrass tile"
+ singular_name = "yellow fairygrass floor tile"
+ desc = "A patch of odd, glowing yellow grass."
+ turf_type = /turf/open/floor/grass/fairy/yellow
+ color = "#FFFF66"
+
+/obj/item/stack/tile/fairygrass/green
+ name = "green fairygrass tile"
+ singular_name = "green fairygrass floor tile"
+ desc = "A patch of odd, glowing green grass."
+ turf_type = /turf/open/floor/grass/fairy/green
+ color = "#99FF99"
+
+/obj/item/stack/tile/fairygrass/blue
+ name = "blue fairygrass tile"
+ singular_name = "blue fairygrass floor tile"
+ desc = "A patch of odd, glowing blue grass."
+ turf_type = /turf/open/floor/grass/fairy/blue
+
+/obj/item/stack/tile/fairygrass/purple
+ name = "purple fairygrass tile"
+ singular_name = "purple fairygrass floor tile"
+ desc = "A patch of odd, glowing purple grass."
+ turf_type = /turf/open/floor/grass/fairy/purple
+ color = "#D966FF"
+
+/obj/item/stack/tile/fairygrass/pink
+ name = "pink fairygrass tile"
+ singular_name = "pink fairygrass floor tile"
+ desc = "A patch of odd, glowing pink grass."
+ turf_type = /turf/open/floor/grass/fairy/pink
+ color = "#FFB3DA"
//Wood
/obj/item/stack/tile/wood
diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm
index 10240e90..9ad60df4 100644
--- a/code/game/objects/items/stacks/wrap.dm
+++ b/code/game/objects/items/stacks/wrap.dm
@@ -13,6 +13,7 @@
amount = 25
max_amount = 25
resistance_flags = FLAMMABLE
+ grind_results = list(/datum/reagent/cellulose = 3)
/obj/item/stack/wrapping_paper/use(used, transfer)
var/turf/T = get_turf(src)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 4d0a6920..a91b592c 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -885,29 +885,41 @@ obj/item/storage/belt/slut/ComponentInitialize()
/obj/item/storage/belt/sabre/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
- final_block_chance = 0 //To thin to block bullets
+ final_block_chance = 0 //Too thin to block bullets
return ..()
/obj/item/storage/belt/botany
- name = "botany belt"
- desc = "A belt used to hold most janitorial supplies."
- icon_state = "grenadebeltold" //reusing the old grenade belt sprite, can't go wrong.
- item_state = "grenadebeltold"
+ name = "botanical belt"
+ desc = "A belt made for holding hydroponics supplies."
+ icon_state = "botanybelt"
+ item_state = "botanybelt"
+ content_overlays = TRUE
+
+/obj/item/storage/belt/botany/New()
+ if(prob(1))
+ new/obj/item/storage/belt/botany/fancy(loc)
+ qdel(src)
+ . = ..()
/obj/item/storage/belt/botany/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 8
+ STR.max_items = 6
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.can_hold = typecacheof(list(
- /obj/item/reagent_containers/glass/beaker,
- /obj/item/reagent_containers/glass/bottle,
- /obj/item/reagent_containers/syringe,
- /obj/item/reagent_containers/spray,
- /obj/item/disk/plantgene,
+ /obj/item/reagent_containers/spray/plantbgone,
+ /obj/item/plant_analyzer,
/obj/item/seeds,
- /obj/item/shovel/spade,
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/glass/beaker,
/obj/item/cultivator,
+ /obj/item/reagent_containers/spray/pestspray,
/obj/item/hatchet,
- /obj/item/plant_analyzer
- ))
+ /obj/item/shovel/spade,
+ /obj/item/gun/energy/floragun
+ ))
+
+/obj/item/storage/belt/botany/fancy //I like citadel's botany belt but I also wanna keep the default
+ desc = "A belt made for holding hydroponics supplies. Oddly enough, it's not green."
+ icon_state = "botanybelt_extra"
+ item_state = "botanybelt_extra"
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index c734b89e..2c7c6a3f 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -105,8 +105,49 @@
icon_state = "fairygrass"
floor_tile = /obj/item/stack/tile/fairygrass
light_range = 2
- light_power = 0.50
+ light_power = 0.80
light_color = "#33CCFF"
+ color = "#33CCFF"
+
+/turf/open/floor/grass/fairy/white
+ name = "white fairygrass patch"
+ light_color = "#FFFFFF"
+ color = "#FFFFFF"
+ floor_tile = /obj/item/stack/tile/fairygrass/white
+
+/turf/open/floor/grass/fairy/red
+ name = "red fairygrass patch"
+ light_color = "#FF3333"
+ color = "#FF3333"
+ floor_tile = /obj/item/stack/tile/fairygrass/red
+
+/turf/open/floor/grass/fairy/yellow
+ name = "yellow fairygrass patch"
+ light_color = "#FFFF66"
+ color = "#FFFF66"
+ floor_tile = /obj/item/stack/tile/fairygrass/yellow
+
+/turf/open/floor/grass/fairy/green
+ name = "green fairygrass patch"
+ light_color = "#99FF99"
+ color = "#99FF99"
+ floor_tile = /obj/item/stack/tile/fairygrass/green
+
+/turf/open/floor/grass/fairy/blue
+ name = "blue fairygrass patch"
+ floor_tile = /obj/item/stack/tile/fairygrass/blue
+
+/turf/open/floor/grass/fairy/purple
+ name = "purple fairygrass patch"
+ light_color = "#D966FF"
+ color = "#D966FF"
+ floor_tile = /obj/item/stack/tile/fairygrass/purple
+
+/turf/open/floor/grass/fairy/pink
+ name = "pink fairygrass patch"
+ light_color = "#FFB3DA"
+ color = "#FFB3DA"
+ floor_tile = /obj/item/stack/tile/fairygrass/pink
/turf/open/floor/grass/snow
gender = PLURAL
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 4c9ddfe3..b5e73c7f 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -8,6 +8,7 @@
var/access_any = FALSE //Do we care about access?
var/list/contains = null //What items are in the crate
var/crate_name = "crate" //The crate that comes with each order
+ var/crate_desc = "" //Crate's description
var/desc = ""//no desc by default
var/crate_type = /obj/structure/closet/crate //what kind of crate - Locked crates needed for access locked crates
var/dangerous = FALSE // Should we message admins?
@@ -19,6 +20,8 @@
/datum/supply_pack/proc/generate(atom/A)
var/obj/structure/closet/crate/C = new crate_type(A)
C.name = crate_name
+ if(crate_desc)
+ C.desc = crate_desc
if(access)
C.req_access = list(access)
if(access_any)
diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm
index c36c49cd..81463d2e 100644
--- a/code/modules/cargo/packs/misc.dm
+++ b/code/modules/cargo/packs/misc.dm
@@ -267,7 +267,7 @@
/datum/supply_pack/misc/lewd
name = "Lewd Crate" // OwO
- desc = "Psss want to have a good time with your sluts? Well I got what you want! Maid clothing, dildos, collars and more!"
+ desc = "Psst, want to have a good time with your sluts? Well I got what you want! Maid clothing, dildos, collars and more!"
cost = 5000
contraband = TRUE
contains = list(/obj/item/dildo/custom,
diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm
index 0287c2a9..55b816d1 100644
--- a/code/modules/cargo/packs/organic.dm
+++ b/code/modules/cargo/packs/organic.dm
@@ -196,9 +196,185 @@
/obj/item/reagent_containers/food/snacks/grown/strawberry)
crate_name = "fruit crate"
+
+//ALIEN-ESQUE SEEDS CRATE
+/datum/supply_pack/organic/rareseeds
+ name = "Galactic Seeds Crate"
+ desc = "Explore the vastness of space, now condensed into a single crate! Contains at least 4 seeds from random regions of space."
+ cost = 9500 //See fill proc. I know this costs a lot
+ contains = list()
+ crate_name = "galactic seeds crate"
+ crate_desc = "A rectangular steel crate."
+ crate_type = /obj/structure/closet/crate/hydroponics
+
+/datum/supply_pack/organic/rareseeds/fill(obj/structure/closet/crate/C)
+ . = ..()
+ var/iteration = 0
+ var/common_seeds = list(
+ /obj/item/seeds/wheat,
+ /obj/item/seeds/wheat/oat,
+ /obj/item/seeds/peas,
+ /obj/item/seeds/tea,
+ /obj/item/seeds/coffee,
+ /obj/item/seeds/poppy,
+ /obj/item/seeds/sunflower,
+ /obj/item/seeds/grass,
+ /obj/item/seeds/glowshroom,
+ /obj/item/seeds/cotton,
+ /obj/item/seeds/reishi,
+ /obj/item/seeds/kudzu, //For some sort of realism that kudzu generally grows everywhere, have it a common seed
+ /obj/item/seeds/starthistle)
+ var/uncommon_seeds = list(
+ /obj/item/seeds/chanterelle/jupitercup,
+ /obj/item/seeds/sunflower/moonflower,
+ /obj/item/seeds/bee_balm,
+ /obj/item/seeds/random,
+ /obj/item/seeds/tea/astra,
+ /obj/item/seeds/peas/laugh,
+ /obj/item/seeds/galaxythistle,
+ /obj/item/seeds/coconut,
+ /obj/item/seeds/ambrosia/deus,
+ /obj/item/seeds/aloe,
+ /obj/item/seeds/cannabis/rainbow,
+ /obj/item/seeds/cannabis/ultimate,
+ /obj/item/seeds/angel,
+ /obj/item/seeds/liberty,
+ /obj/item/seeds/plump/walkingmushroom,
+ /obj/item/seeds/chanterelle,
+ /obj/item/seeds/glowshroom/shadowshroom)
+ var/xenoarch_seeds = list(
+ /obj/item/seeds/amauri,
+ /obj/item/seeds/gelthi,
+ /obj/item/seeds/jurlmah,
+ /obj/item/seeds/nofruit,
+ /obj/item/seeds/shand,
+ /obj/item/seeds/surik,
+ /obj/item/seeds/telriis,
+ /obj/item/seeds/thaadra,
+ /obj/item/seeds/vale,
+ /obj/item/seeds/vaporsac)
+ var/lavaland_seeds = list(
+ /obj/item/seeds/lavaland/polypore,
+ /obj/item/seeds/lavaland/porcini,
+ /obj/item/seeds/lavaland/inocybe,
+ /obj/item/seeds/lavaland/ember,
+ /obj/item/seeds/lavaland/cactus)
+ while((prob(68) || iteration <= 4) && iteration <= 15)
+ iteration++
+ var/obj/item/seeds/chosen_seed = null
+ var/obj/item/seeds/cache = null
+ switch(iteration)
+ if(1 to 3)
+ chosen_seed = pick(common_seeds)
+ if(4)
+ if(prob(25))
+ chosen_seed = pick(lavaland_seeds)
+ else
+ chosen_seed = pick(common_seeds)
+ if(5)
+ if(prob(40))
+ chosen_seed = pick(lavaland_seeds)
+ else
+ chosen_seed = pick(common_seeds)
+ if(6)
+ if(prob(70))
+ chosen_seed = pick(common_seeds)
+ else
+ chosen_seed = pick(uncommon_seeds)
+ if(7)
+ if(prob(3))
+ chosen_seed = pick(xenoarch_seeds)
+ else if(prob(40))
+ chosen_seed = pick(common_seeds)
+ else
+ chosen_seed = pick(uncommon_seeds)
+ if(8 to 10)
+ if(prob(8))
+ chosen_seed = pick(xenoarch_seeds)
+ else
+ chosen_seed = pick(uncommon_seeds)
+ if(11 to INFINITY)
+ if(prob(15))
+ chosen_seed = pick(xenoarch_seeds)
+ else if (prob(50))
+ chosen_seed = pick(uncommon_seeds)
+ else
+ chosen_seed = pick(lavaland_seeds)
+
+ new chosen_seed(C)
+ cache = chosen_seed
+ //Make it actually seem like it's from another galaxy with all this stuff
+ if(prob(23) && !istype(chosen_seed, /obj/item/seeds/starthistle))
+ chosen_seed.rarity += 1
+
+ var/mutated = FALSE
+ for(var/datum/plant_gene/G in cache.genes)
+ if(locate(G) in chosen_seed.genes && prob(60))
+ if(prob(50))
+ chosen_seed.unset_mutability(G, PLANT_GENE_EXTRACTABLE)
+ chosen_seed.rarity += 5
+ else if(prob(70))
+ chosen_seed.unset_mutability(G, PLANT_GENE_REMOVABLE)
+ chosen_seed.rarity += 5
+ else if(!istype(G, /datum/plant_gene/core))
+ chosen_seed.forbiddengenes += G.type //Has the slim chance to make this plant unable to produce anything it started out with
+ chosen_seed.genes -= locate(G) in chosen_seed.genes //Sanity check
+ chosen_seed.rarity += 10
+
+ if(prob(65)) //To make this seem even more otherworldly
+ //Our own version of add_random_reagents
+ var/random_amount = round(rand(0, 25), 5) * 0.01
+ if(random_amount <= 0) random_amount = 0.02
+ var/datum/plant_gene/reagent/R = new(get_random_reagent_id(), random_amount)
+
+ if(R.can_add(chosen_seed))
+ chosen_seed.genes += R
+ chosen_seed.rarity += 5
+ else
+ qdel(R)
+ chosen_seed.reagents_from_genes()
+
+ if(prob(3)) //This is insanely rare, but we will use different grow sprites. Probably will fuck something up
+ var/obj/item/seeds/S = pick(subtypesof(/obj/item/seeds))
+ if(prob(85))
+ chosen_seed.plantname = "[pick("Alien", "Supernatural", "Artificial", "Modified")] [S.plantname]"
+ chosen_seed.rarity += 20*(!mutated)
+ else
+ chosen_seed.plantname = S.plantname
+ chosen_seed.growing_icon = S.growing_icon
+ chosen_seed.species = S.species
+ chosen_seed.icon_grow = S.icon_grow
+ chosen_seed.icon_harvest = S.icon_harvest
+ chosen_seed.icon_dead = S.icon_dead
+ chosen_seed.rarity += 35*(!mutated) //woah nelly
+ mutated = TRUE
+
+ else if(prob(70)) //Add basic reagents from grounded sheets, but only small amounts
+ var/A = rand(1, 5)
+ var/chosen_reagent
+ switch(A)
+ if(1)
+ chosen_reagent = /datum/reagent/toxin/plasma
+ if(2)
+ chosen_reagent = /datum/reagent/uranium
+ if(3)
+ chosen_reagent = /datum/reagent/iron
+ if(4)
+ chosen_reagent = /datum/reagent/gold
+ if(5)
+ chosen_reagent = /datum/reagent/cellulose
+ var/datum/plant_gene/reagent/R = new(chosen_reagent, A*0.02)
+ if(R.can_add(chosen_seed))
+ chosen_seed.genes += R
+ chosen_seed.rarity += 5
+ else
+ qdel(R)
+ chosen_seed.reagents_from_genes()
+ //All in a while() loop! Very efficient I know
+
/datum/supply_pack/organic/grill
name = "Grilling Starter Kit"
- desc = "Hey dad I'm Hungry. Hi Hungry I'm THE NEW GRILLING STARTER KIT ONLY 5000 BUX GET NOW! Contains a cooking grill and five fuel coal sheets."
+ desc = "Hey dad, I'm Hungry. Hi Hungry I'm THE NEW GRILLING STARTER KIT ONLY 5000 BUX GET NOW! Contains a cooking grill and five fuel coal sheets."
cost = 3000
crate_type = /obj/structure/closet/crate
contains = list(/obj/item/stack/sheet/mineral/coal/five,
@@ -277,11 +453,9 @@
/datum/supply_pack/organic/hydroponics
name = "Hydroponics Crate"
- desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron."
+ desc = "Supplies for growing a great garden! Contains two bottles of ammonia, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron."
cost = 1750
- contains = list(/obj/item/reagent_containers/spray/plantbgone,
- /obj/item/reagent_containers/spray/plantbgone,
- /obj/item/reagent_containers/glass/bottle/ammonia,
+ contains = list(/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/hatchet,
/obj/item/cultivator,
@@ -326,6 +500,33 @@
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass)
crate_name = "kitchen cutlery deluxe set"
+/datum/supply_pack/organic/hydroponics/maintgarden
+ name = "Maintenance Garden Crate"
+ desc = "Set up your own tiny paradise with do-it-yourself botany kit. Contains sandstone for dirt plots, pest spray, ammonia, a portable seed generator, basic botanical tools, and some seeds to start off with."
+ cost = 2700
+ contains = list(/obj/item/storage/bag/plants/portaseeder,
+ /obj/item/reagent_containers/spray/pestspray,
+ /obj/item/stack/sheet/mineral/sandstone/twelve,
+ /obj/item/reagent_containers/glass/bucket,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
+ /obj/item/hatchet,
+ /obj/item/cultivator,
+ /obj/item/plant_analyzer,
+ /obj/item/clothing/gloves/botanic_leather,
+ /obj/item/clothing/suit/apron,
+ /obj/item/flashlight,
+ /obj/item/seeds/carrot,
+ /obj/item/seeds/carrot,
+ /obj/item/seeds/tower,
+ /obj/item/seeds/tower,
+ /obj/item/seeds/watermelon,
+ /obj/item/seeds/watermelon,
+ /obj/item/seeds/grass,
+ /obj/item/seeds/grass)
+ crate_name = "maint garden crate"
+ crate_type = /obj/structure/closet/crate/hydroponics
+
/datum/supply_pack/organic/mre
name = "MRE supply kit (emergency rations)"
desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank."
@@ -399,7 +600,7 @@
/obj/item/seeds/carrot,
/obj/item/seeds/sunflower,
/obj/item/seeds/rose,
- /obj/item/seeds/chanter,
+ /obj/item/seeds/chanterelle,
/obj/item/seeds/potato,
/obj/item/seeds/sugarcane)
crate_name = "seeds crate"
diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm
index 249d1aa8..d2656e29 100644
--- a/code/modules/cargo/packs/service.dm
+++ b/code/modules/cargo/packs/service.dm
@@ -314,6 +314,14 @@
crate_name = "games supply crate"
crate_type = /obj/structure/closet/crate
+/datum/supply_pack/vending/hydro
+ name = "Hydroponics Supply Crate"
+ desc = "Arnt you glad you dont have to do it the natural way? Contains a megaseed and nutrimax vending machine refill."
+ cost = 5000
+ contains = list(/obj/item/vending_refill/hydroseeds,
+ /obj/item/vending_refill/hydronutrients)
+ crate_name = "hydroponics supply crate"
+
/datum/supply_pack/service/vending/snack
name = "Snack Supply Crate"
desc = "One vending machine refill of cavity-bringin' goodness! The number one dentist recommended order!"
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
index 1f4bf900..52843dcf 100644
--- a/code/modules/crafting/craft.dm
+++ b/code/modules/crafting/craft.dm
@@ -111,6 +111,10 @@
for(var/datum/reagent/A in RC.reagents.reagent_list)
.["other"][A.type] += A.volume
.["other"][I.type] += 1
+ if(istype(I, /obj/item/reagent_containers/food/snacks/grown) && !.["color"]) //First we find has priority
+ var/obj/item/reagent_containers/food/snacks/grown/G = I
+ if(G.modified_colors)
+ .["color"] = G.color
/datum/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents)
if(!R.tools.len)
@@ -146,6 +150,9 @@
/datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R)
var/list/contents = get_surroundings(user)
var/send_feedback = 1
+ var/cached_color = null
+ if(contents["color"]) //From plants
+ cached_color = contents["color"]
if(check_contents(R, contents))
if(check_tools(user, R, contents))
if(do_after(user, R.time, target = user))
@@ -157,6 +164,7 @@
var/list/parts = del_reqs(R, user)
var/atom/movable/I = new R.result (get_turf(user.loc))
I.CheckParts(parts, R)
+ I.color = cached_color
if(send_feedback)
SSblackbox.record_feedback("tally", "object_crafted", 1, I.type)
return 0
diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm
index 7b1d9944..066ef524 100644
--- a/code/modules/crafting/recipes/recipes_clothing.dm
+++ b/code/modules/crafting/recipes/recipes_clothing.dm
@@ -293,3 +293,11 @@
time = 60
always_availible = TRUE
category = CAT_CLOTHING
+
+/datum/crafting_recipe/garlic_necklace
+ name = "Garlic Necklace"
+ result = /obj/item/clothing/neck/garlic_necklace
+ reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 15,
+ /obj/item/stack/cable_coil = 10)
+ time = 100 //Takes a while to put all the garlics on the coil and knot it.
+ category = CAT_CLOTHING
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index cd6b945a..623179f8 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -396,6 +396,16 @@
list_reagents = list(/datum/reagent/consumable/orangejuice = 100)
foodtype = FRUIT| BREAKFAST
+/obj/item/reagent_containers/food/drinks/bottle/bio_carton
+ name = "small carton box"
+ desc = "A small biodegradable carton box made from plant biomatter."
+ icon_state = "eco_box"
+ item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+ volume = 50
+ isGlass = FALSE
+
/obj/item/reagent_containers/food/drinks/bottle/cream
name = "milk cream"
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
index e08e8f3e..8f56931c 100644
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -119,7 +119,7 @@
slices_num = 5
bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR | ANTITOXIC
/obj/item/reagent_containers/food/snacks/cakeslice/lime
name = "lime cake slice"
@@ -127,7 +127,7 @@
icon_state = "limecake_slice"
filling_color = "#00FF00"
tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR | ANTITOXIC
/obj/item/reagent_containers/food/snacks/store/cake/lemon
name = "lemon cake"
diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm
index 8de7e170..3e95db83 100644
--- a/code/modules/food_and_drinks/food/snacks_frozen.dm
+++ b/code/modules/food_and_drinks/food/snacks_frozen.dm
@@ -59,7 +59,7 @@
icon_state = "lime_sc"
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/limejuice = 5)
tastes = list("ice" = 1, "water" = 1, "limes" = 5)
- foodtype = FRUIT
+ foodtype = FRUIT | ANTITOXIC
/obj/item/reagent_containers/food/snacks/snowcones/lemon
name = "lemon snowcone"
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index f5d84d65..a2b65e3e 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -223,7 +223,7 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //lollipop, but vitamins = toxins
filling_color = "#00800"
tastes = list("cobwebs" = 1, "sugar" = 2)
- foodtype = JUNKFOOD | SUGAR
+ foodtype = JUNKFOOD | SUGAR | ANTITOXIC
/obj/item/reagent_containers/food/snacks/tobiko
name = "tobiko"
@@ -443,7 +443,7 @@
var/mutable_appearance/head
var/headcolor = rgb(0, 0, 0)
tastes = list("candy" = 1)
- foodtype = JUNKFOOD | SUGAR
+ foodtype = JUNKFOOD | SUGAR | ANTITOXIC
/obj/item/reagent_containers/food/snacks/lollipop/Initialize()
. = ..()
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index 045bfd08..e06e095b 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -452,7 +452,7 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 3)
cooked_type = null
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
- foodtype = GRAIN
+ foodtype = GRAIN | ANTITOXIC
/obj/item/reagent_containers/food/snacks/dankpocket
name = "\improper Dank-pocket"
@@ -613,9 +613,11 @@
name = "exceptional plump helmet biscuit"
desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!"
bonus_reagents = list(/datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ foodtype |= ANTITOXIC
. = ..()
if(fey)
reagents.add_reagent(/datum/reagent/medicine/omnizine, 5)
+ foodtype |= ANTITOXIC
/obj/item/reagent_containers/food/snacks/cracker
name = "cracker"
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index 4d4a4f00..35ac1390 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -149,8 +149,10 @@
name = "exceptional plump pie"
desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!"
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
+ foodtype |= ANTITOXIC
if(fey)
reagents.add_reagent(/datum/reagent/medicine/omnizine, 5)
+ foodtype |= ANTITOXIC
/obj/item/reagent_containers/food/snacks/pie/xemeatpie
diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm
index 6aebe303..c0e5f345 100644
--- a/code/modules/food_and_drinks/food/snacks_pizza.dm
+++ b/code/modules/food_and_drinks/food/snacks_pizza.dm
@@ -98,7 +98,7 @@
bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/medicine/omnizine = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1)
- foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD
+ foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD | ANTITOXIC
/obj/item/reagent_containers/food/snacks/pizzaslice/donkpocket
name = "donkpocket pizza slice"
@@ -106,7 +106,7 @@
icon_state = "donkpocketpizzaslice"
filling_color = "#FFA500"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1)
- foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD
+ foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD | ANTITOXIC
/obj/item/reagent_containers/food/snacks/pizza/dank
name = "dank pizza"
@@ -116,7 +116,7 @@
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 6)
list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
- foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY
+ foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY | ANTITOXIC
/obj/item/reagent_containers/food/snacks/pizzaslice/dank
name = "dank pizza slice"
@@ -124,7 +124,7 @@
icon_state = "dankpizzaslice"
filling_color = "#2E8B57"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
- foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY
+ foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY | ANTITOXIC
/obj/item/reagent_containers/food/snacks/pizza/sassysage
name = "sassysage pizza"
diff --git a/code/modules/food_and_drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm
index 5dd7ad48..318d1edc 100644
--- a/code/modules/food_and_drinks/food/snacks_salad.dm
+++ b/code/modules/food_and_drinks/food/snacks_salad.dm
@@ -20,7 +20,7 @@
bonus_reagents = list(/datum/reagent/medicine/omnizine = 2, /datum/reagent/consumable/nutriment/vitamin = 6)
list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/medicine/omnizine = 8, /datum/reagent/consumable/nutriment/vitamin = 6)
tastes = list("leaves" = 1)
- foodtype = VEGETABLES
+ foodtype = VEGETABLES | ANTITOXIC
/obj/item/reagent_containers/food/snacks/salad/herbsalad
name = "herb salad"
@@ -38,7 +38,7 @@
bonus_reagents = list(/datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("leaves" = 1, "potato" = 1, "meat" = 1, "valids" = 1)
- foodtype = VEGETABLES | MEAT | FRIED | JUNKFOOD | FRUIT
+ foodtype = VEGETABLES | MEAT | FRIED | JUNKFOOD | FRUIT | ANTITOXIC
/obj/item/reagent_containers/food/snacks/salad/oatmeal
name = "oatmeal"
diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm
index 7b498c7c..44dd01ec 100644
--- a/code/modules/food_and_drinks/food/snacks_soup.dm
+++ b/code/modules/food_and_drinks/food/snacks_soup.dm
@@ -89,7 +89,7 @@
icon_state = "nettlesoup"
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("nettles" = 1)
- foodtype = VEGETABLES
+ foodtype = VEGETABLES | ANTITOXIC
/obj/item/reagent_containers/food/snacks/soup/mystery
name = "mystery soup"
diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm
index 72949edc..db4abc6c 100644
--- a/code/modules/food_and_drinks/food/snacks_vend.dm
+++ b/code/modules/food_and_drinks/food/snacks_vend.dm
@@ -106,8 +106,8 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/doctor_delight = 5)
filling_color = "#F5F5DC"
tastes = list("sweetness" = 3, "cake" = 1)
- foodtype = GRAIN | FRUIT | VEGETABLES
- price = 5
+ foodtype = GRAIN | FRUIT | VEGETABLES | ANTITOXIC
+ price = 5
/obj/item/reagent_containers/food/snacks/carbonnanotube_noodles
name = "carbon nanotube noodles"
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index ac750a04..02c3ccbc 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -67,7 +67,7 @@
return
/obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params)
- if(user.a_intent == INTENT_HARM)
+ if(user.a_intent != INTENT_HELP)
return ..()
if(processing)
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index 1d34d15c..950277ce 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -307,6 +307,17 @@
seed.genes -= G
if(istype(G, /datum/plant_gene/reagent))
seed.reagents_from_genes()
+ if(istype(G, /datum/plant_gene/trait/modified_color))
+ var/datum/plant_gene/trait/modified_color/found
+ for(var/datum/plant_gene/trait/modified_color/T in seed.genes)
+ if(istype(T, /datum/plant_gene/trait/modified_color) && T.type != G.type)
+ found = T
+ break
+ if(found)
+ seed.color = found.color
+ else
+ seed.color = null
+ seed.modified_colors = FALSE
repaint_seed()
if("extract")
if(disk && !disk.read_only)
@@ -343,6 +354,10 @@
seed.genes += disk.gene.Copy()
if(istype(disk.gene, /datum/plant_gene/reagent))
seed.reagents_from_genes()
+ if(istype(disk.gene, /datum/plant_gene/trait/modified_color) && !seed.modified_colors)
+ var/datum/plant_gene/trait/modified_color/M = disk.gene
+ seed.color = M.color
+ seed.modified_colors = TRUE
disk.gene.apply_vars(seed)
repaint_seed()
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 9dddb622..5895c6de 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -20,6 +20,7 @@
var/distill_reagent //If NULL and this object can be distilled, it uses a generic fruit_wine reagent and adjusts its variables.
var/wine_flavor //If NULL, this is automatically set to the fruit's flavor. Determines the flavor of the wine if distill_reagent is NULL.
var/wine_power = 10 //Determines the boozepwr of the wine if distill_reagent is NULL.
+ var/modified_colors = FALSE
/obj/item/reagent_containers/food/snacks/grown/Initialize(mapload, obj/item/seeds/new_seed)
. = ..()
diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm
index e8402520..b8480a19 100644
--- a/code/modules/hydroponics/grown/ambrosia.dm
+++ b/code/modules/hydroponics/grown/ambrosia.dm
@@ -49,6 +49,7 @@
seed = /obj/item/seeds/ambrosia/deus
name = "ambrosia deus branch"
desc = "Eating this makes you feel immortal!"
+ foodtype = VEGETABLES | ANTITOXIC
icon_state = "ambrosiadeus"
filling_color = "#008B8B"
wine_power = 50
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index cc66e188..162bbbc5 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -27,6 +27,12 @@
juice_results = list(/datum/reagent/consumable/banana = 0)
distill_reagent = /datum/reagent/consumable/ethanol/bananahonk
+/obj/item/reagent_containers/food/snacks/grown/banana/generate_trash(atom/location)
+ . = ..()
+ var/obj/item/grown/bananapeel/peel = .
+ if(istype(peel))
+ peel.grind_results = list(/datum/reagent/consumable/banana_peel = seed.potency * 0.2)
+
/obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
user.visible_message("[user] is aiming [src] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!")
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
@@ -120,6 +126,41 @@
desc = "A peel from a bluespace banana."
icon_state = "banana_peel_blue"
+//Banana Spider
+/obj/item/seeds/banana/exotic_banana
+ name = "pack of exotic banana seeds"
+ desc = "They're seeds that grow into banana trees. However, those bananas might be alive."
+ icon_state = "seed_exoticbanana"
+ species = "exoticbanana"
+ icon_grow = "banana-grow"
+ plantname = "Exotic Banana Tree"
+ product = /obj/item/reagent_containers/food/snacks/grown/banana/banana_spider_spawnable
+ mutatelist = list()
+ genes = list(/datum/plant_gene/trait/slip)
+
+/obj/item/reagent_containers/food/snacks/grown/banana/banana_spider_spawnable
+ seed = /obj/item/seeds/banana/exotic_banana
+ name = "banana spider"
+ desc = "You do not know what it is, but you can bet the clown would love it."
+ icon_state = "exoticbanana"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
+ foodtype = GROSS | MEAT | RAW | FRUIT
+ grind_results = list(/datum/reagent/blood = 20, /datum/reagent/liquidgibs = 5)
+ var/awakening = 0
+
+/obj/item/reagent_containers/food/snacks/grown/banana/banana_spider_spawnable/attack_self(mob/user)
+ if(awakening || isspaceturf(user.loc))
+ return
+ to_chat(user, "You decide to wake up the banana spider...")
+ awakening = 1
+
+ spawn(30)
+ if(!QDELETED(src))
+ var/mob/living/simple_animal/banana_spider/S = new /mob/living/simple_animal/banana_spider(get_turf(src.loc))
+ S.speed += round(10 / max(seed.potency, 1), 1)
+ S.visible_message("The banana spider chitters as it stretches its legs.")
+ qdel(src)
+
// Other
/obj/item/grown/bananapeel/specialpeel //used by /obj/item/clothing/shoes/clown_shoes/banana_shoes
name = "synthesized banana peel"
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
index ec7fcef6..80792538 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -261,7 +261,7 @@
seed = /obj/item/seeds/strawberry
name = "strawberry"
icon_state = "strawberry"
- filling_color = "#7FFF00"
- juice_results = list("strawberryjuice" = 0)
+ filling_color = "#E50D31"
+ juice_results = list(/datum/reagent/consumable/strawberryjuice = 0)
tastes = list("strawberries" = 1)
wine_power = 20
diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm
index a7e571d7..fcde38fd 100644
--- a/code/modules/hydroponics/grown/cannabis.dm
+++ b/code/modules/hydroponics/grown/cannabis.dm
@@ -14,12 +14,9 @@
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)
+ /obj/item/seeds/cannabis/death)
reagents_add = list(/datum/reagent/drug/space_drugs = 0.15, /datum/reagent/toxin/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."
@@ -27,7 +24,7 @@
species = "megacannabis"
plantname = "Rainbow Weed"
product = /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow
- mutatelist = list()
+ mutatelist = list(/obj/item/seeds/cannabis/ultimate)
reagents_add = list(/datum/reagent/toxin/mindbreaker = 0.15, /datum/reagent/toxin/lipolicide = 0.35)
rarity = 40
@@ -38,7 +35,7 @@
species = "blackcannabis"
plantname = "Deathweed"
product = /obj/item/reagent_containers/food/snacks/grown/cannabis/death
- mutatelist = list()
+ mutatelist = list(/obj/item/seeds/cannabis/white)
reagents_add = list(/datum/reagent/toxin/cyanide = 0.35, /datum/reagent/drug/space_drugs = 0.15, /datum/reagent/toxin/lipolicide = 0.15)
rarity = 40
@@ -61,6 +58,7 @@
species = "ocannabis"
plantname = "Omega Weed"
product = /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate
+ genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/green)
mutatelist = list()
reagents_add = list(/datum/reagent/drug/space_drugs = 0.3,
/datum/reagent/toxin/mindbreaker = 0.3,
@@ -105,6 +103,7 @@
seed = /obj/item/seeds/cannabis/death
name = "death cannabis leaf"
desc = "Looks a bit dark. Oh well."
+ foodtype = VEGETABLES | TOXIC
icon_state = "blackcannabis"
wine_power = 40
@@ -112,6 +111,7 @@
seed = /obj/item/seeds/cannabis/white
name = "white cannabis leaf"
desc = "It feels smooth and nice to the touch."
+ foodtype = VEGETABLES | ANTITOXIC
icon_state = "whitecannabis"
wine_power = 10
diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm
index c5a7e079..946831c1 100644
--- a/code/modules/hydroponics/grown/cereals.dm
+++ b/code/modules/hydroponics/grown/cereals.dm
@@ -29,10 +29,11 @@
// Oat
/obj/item/seeds/wheat/oat
name = "pack of oat seeds"
- desc = "These may, or may not, grow into oat."
+ desc = "Oat's just a matter of time..."
icon_state = "seed-oat"
species = "oat"
plantname = "Oat Stalks"
+ rarity = 10 //Not really new, just better
product = /obj/item/reagent_containers/food/snacks/grown/oat
mutatelist = list()
@@ -45,14 +46,14 @@
filling_color = "#556B2F"
bitesize_mod = 2
foodtype = GRAIN
- grind_results = list(/datum/reagent/consumable/flour = 0)
+ grind_results = list(/datum/reagent/consumable/flour = 0.5) //So when it grinds it has 50% more flour
tastes = list("oat" = 1)
distill_reagent = /datum/reagent/consumable/ethanol/ale
// Rice
/obj/item/seeds/wheat/rice
name = "pack of rice seeds"
- desc = "These may, or may not, grow into rice."
+ desc = "Rice, rice, baby!"
icon_state = "seed-rice"
species = "rice"
plantname = "Rice Stalks"
@@ -81,6 +82,7 @@
species = "meatwheat"
plantname = "Meatwheat"
product = /obj/item/reagent_containers/food/snacks/grown/meatwheat
+ rarity = 40
mutatelist = list()
/obj/item/reagent_containers/food/snacks/grown/meatwheat
diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm
index 61c81aa2..18bde6e4 100644
--- a/code/modules/hydroponics/grown/citrus.dm
+++ b/code/modules/hydroponics/grown/citrus.dm
@@ -29,6 +29,7 @@
seed = /obj/item/seeds/lime
name = "lime"
desc = "It's so sour, your face will twist."
+ foodtype = FRUIT | ANTITOXIC
icon_state = "lime"
filling_color = "#00FF00"
juice_results = list(/datum/reagent/consumable/limejuice = 0)
@@ -61,6 +62,7 @@
juice_results = list(/datum/reagent/consumable/orangejuice = 0)
distill_reagent = /datum/reagent/consumable/ethanol/triple_sec
+
//3D Orange
/obj/item/seeds/orange_3d
name = "pack of extradimensional orange seeds"
@@ -68,7 +70,7 @@
icon_state = "seed-orange"
species = "orange"
plantname = "Extradimensional Orange Tree"
- product = /obj/item/reagent_containers/food/snacks/grown/citrus/orange
+ product = /obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d
lifespan = 60
endurance = 50
yield = 5
@@ -80,14 +82,14 @@
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/haloperidol = 0.15)
/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d
- seed = /obj/item/seeds/orange
+ seed = /obj/item/seeds/orange_3d
name = "extradminesional orange"
desc = "You can hardly wrap your head around this thing."
icon_state = "orang"
filling_color = "#FFA500"
juice_results = list(/datum/reagent/consumable/orangejuice = 0)
- distill_reagent = /datum/reagent/consumable/ethanol/triple_sec
- tastes = list("polygons" = 1, "oranges" = 1)
+ distill_reagent = /datum/reagent/toxin/mindbreaker
+ tastes = list("polygons" = 1, "bluespace" = 1, "the true nature of reality" = 1)
/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d/pickup(mob/user)
. = ..()
diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm
index 4ea247f4..00ab3554 100644
--- a/code/modules/hydroponics/grown/cocoa_vanilla.dm
+++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm
@@ -99,4 +99,4 @@
. =..()
reagents.clear_reagents()
reagents.add_reagent(/datum/reagent/toxin/bungotoxin, seed.potency * 0.10) //More than this will kill at too low potency
- reagents.add_reagent(/datum/reagent/consumable/nutriment, seed.potency * 0.04)
\ No newline at end of file
+ reagents.add_reagent(/datum/reagent/consumable/nutriment, seed.potency * 0.04)
diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm
index 691cbb83..b9108e51 100644
--- a/code/modules/hydroponics/grown/corn.dm
+++ b/code/modules/hydroponics/grown/corn.dm
@@ -38,6 +38,7 @@
throwforce = 0
throw_speed = 3
throw_range = 7
+ grind_results = list(/datum/reagent/cellulose = 10)
/obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, params)
if(W.is_sharp())
diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm
index a3ac7d33..a898b76e 100644
--- a/code/modules/hydroponics/grown/cotton.dm
+++ b/code/modules/hydroponics/grown/cotton.dm
@@ -76,4 +76,4 @@
throw_range = 3
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
cotton_type = /obj/item/stack/sheet/cotton/durathread
- cotton_name = "raw durathread"
\ No newline at end of file
+ cotton_name = "raw durathread"
diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm
index 35272844..77e2e73e 100644
--- a/code/modules/hydroponics/grown/garlic.dm
+++ b/code/modules/hydroponics/grown/garlic.dm
@@ -9,7 +9,10 @@
potency = 25
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
- reagents_add = list("garlic" = 0.15, "nutriment" = 0.1)
+ icon_grow = "garlic-grow"
+ icon_harvest = "garlic-harvest"
+ icon_dead = "garlic-dead"
+ reagents_add = list(/datum/reagent/consumable/garlic = 0.15, /datum/reagent/consumable/nutriment = 0.1)
/obj/item/reagent_containers/food/snacks/grown/garlic
seed = /obj/item/seeds/garlic
@@ -19,4 +22,11 @@
filling_color = "#C0C9A0"
bitesize_mod = 2
tastes = list("garlic" = 1)
- wine_power = 10
\ No newline at end of file
+ wine_power = 10
+
+/obj/item/clothing/neck/garlic_necklace
+ name = "garlic necklace"
+ desc = "A clove of garlic on a cable, tied to itself in a circle, just might fit around your neck. For loonies people who fear getting their blood sucked."
+ icon_state = "garlic_necklace"
+ item_state = "garlic_necklace"
+
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
index 6b01eeb3..d65280a3 100644
--- a/code/modules/hydroponics/grown/grass_carpet.dm
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -27,7 +27,7 @@
bitesize_mod = 2
var/stacktype = /obj/item/stack/tile/grass
var/tile_coefficient = 0.02 // 1/50
- wine_power = 15
+ distill_reagent = /datum/reagent/consumable/ethanol/beer/green
/obj/item/reagent_containers/food/snacks/grown/grass/attack_self(mob/user)
to_chat(user, "You prepare the astroturf.")
@@ -49,17 +49,46 @@
plantname = "Fairygrass"
product = /obj/item/reagent_containers/food/snacks/grown/grass/fairy
icon_grow = "fairygrass-grow"
- icon_dead = "fairygrass-dead"
+ icon_dead = "grass-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/blue)
+ mutatelist = list (/obj/item/seeds/grass/carpet)
reagents_add = list(/datum/reagent/consumable/nutriment = 0.02, /datum/reagent/hydrogen = 0.05, /datum/reagent/drug/space_drugs = 0.15)
/obj/item/reagent_containers/food/snacks/grown/grass/fairy
seed = /obj/item/seeds/grass/fairy
name = "fairygrass"
- desc = "Blue, glowing, and smells fainly of mushrooms."
+ desc = "Smells fainly of mushrooms."
icon_state = "fairygrassclump"
filling_color = "#3399ff"
stacktype = /obj/item/stack/tile/fairygrass
+ distill_reagent = /datum/reagent/consumable/ethanol/beer/light
+
+/obj/item/reagent_containers/food/snacks/grown/grass/fairy/attack_self(mob/user)
+ var/datum/plant_gene/trait/glow/G = null
+ for(var/datum/plant_gene/trait/glow/gene in seed.genes)
+ G = gene
+ break
+
+ stacktype = initial(stacktype)
+
+ if(G)
+ switch(G.type)
+ if(/datum/plant_gene/trait/glow/white)
+ stacktype = /obj/item/stack/tile/fairygrass/white
+ if(/datum/plant_gene/trait/glow/red)
+ stacktype = /obj/item/stack/tile/fairygrass/red
+ if(/datum/plant_gene/trait/glow/yellow)
+ stacktype = /obj/item/stack/tile/fairygrass/yellow
+ if(/datum/plant_gene/trait/glow/green)
+ stacktype = /obj/item/stack/tile/fairygrass/green
+ if(/datum/plant_gene/trait/glow/blue)
+ stacktype = /obj/item/stack/tile/fairygrass/blue
+ if(/datum/plant_gene/trait/glow/purple)
+ stacktype = /obj/item/stack/tile/fairygrass/purple
+ if(/datum/plant_gene/trait/glow/pink)
+ stacktype = /obj/item/stack/tile/fairygrass/pink
+
+ . = ..()
// Carpet
/obj/item/seeds/grass/carpet
@@ -69,7 +98,7 @@
species = "carpet"
plantname = "Carpet"
product = /obj/item/reagent_containers/food/snacks/grown/grass/carpet
- mutatelist = list()
+ mutatelist = list(/obj/item/seeds/grass/fairy)
rarity = 10
/obj/item/reagent_containers/food/snacks/grown/grass/carpet
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
index 5f1fdcda..ef78b972 100644
--- a/code/modules/hydroponics/grown/kudzu.dm
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -1,4 +1,4 @@
-// A very special plant, deserving it's own file.
+// A very special plant, deserving its own file.
/obj/item/seeds/kudzu
name = "pack of kudzu seeds"
diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm
index bc92b5d3..adf710d9 100644
--- a/code/modules/hydroponics/grown/melon.dm
+++ b/code/modules/hydroponics/grown/melon.dm
@@ -61,7 +61,19 @@
/obj/item/reagent_containers/food/snacks/grown/holymelon/Initialize()
. = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE) //deliver us from evil o melon god
+ var/uses = 1
+ if(seed)
+ uses = round(seed.potency / 20)
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, uses, TRUE, CALLBACK(src, .proc/block_magic), CALLBACK(src, .proc/expire)) //deliver us from evil o melon god
+
+/obj/item/reagent_containers/food/snacks/grown/holymelon/proc/block_magic(mob/user, major)
+ if(major)
+ visible_message("[src] hums slightly, and seems to decay a bit.")
+
+/obj/item/reagent_containers/food/snacks/grown/holymelon/proc/expire(mob/user)
+ visible_message("[src] rapidly turns into ash!")
+ qdel(src)
+ new /obj/effect/decal/cleanable/ash(drop_location())
//Milkmelon
/obj/item/seeds/watermelon/milk
@@ -84,4 +96,4 @@
filling_color = "#FFAABB"
dried_type = null
wine_power = 30
- wine_flavor = "creamy"
\ No newline at end of file
+ wine_flavor = "creamy"
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index fcf44b3b..551e831e 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -1,7 +1,7 @@
// Starthistle
/obj/item/seeds/starthistle
name = "pack of starthistle seeds"
- desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots."
+ desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots. Grind down these seeds for a substitution of mustardgrind."
icon_state = "seed-starthistle"
species = "starthistle"
plantname = "Starthistle"
@@ -9,7 +9,7 @@
endurance = 50 // damm pesky weeds
maturation = 5
production = 1
- yield = 2
+ yield = 6
potency = 10
growthstages = 3
grind_results = list(/datum/reagent/mustardgrind = 1)
@@ -58,7 +58,6 @@
var/datum/gas_mixture/stank = new
var/list/cached_gases = stank.gases
-
cached_gases[/datum/gas/miasma] += (yield + 5)*7*MIASMA_CORPSE_MOLES // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses
stank.temperature = T20C // without this the room would eventually freeze and miasma mining would be easier
T.assume_air(stank)
@@ -261,14 +260,17 @@
/obj/item/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/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime()
+/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime(mob/living/lanced_by)
icon_state = "cherry_bomb_lit"
playsound(src, 'sound/effects/fuse.ogg', seed.potency, 0)
+ addtimer(CALLBACK(src, /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate), rand(50, 100))
+
+/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate()
reagents.chem_temp = 1000 //Sets off the black powder
reagents.handle_reactions()
-// Lavaland cactus
+// Lavaland Cactus
/obj/item/seeds/lavaland/cactus
name = "pack of fruiting cactus seeds"
desc = "These seeds grow into fruiting cacti."
@@ -279,6 +281,7 @@
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
growthstages = 2
+
// Coconut
/obj/item/seeds/coconut
name = "pack of coconut seeds"
@@ -322,8 +325,7 @@
/obj/item/reagent_containers/food/snacks/grown/coconut/Initialize(mapload, obj/item/seeds/new_seed)
. = ..()
- var/newvolume
- newvolume = 50 + round(seed.potency,10)
+ var/newvolume = 50 + round(seed.potency,10)
if (seed.get_gene(/datum/plant_gene/trait/maxchem))
newvolume = newvolume + 50
volume = newvolume
@@ -333,23 +335,27 @@
transform *= TRANSFORM_USING_VARIABLE(40, 100) + 0.5 //temporary fix for size?
/obj/item/reagent_containers/food/snacks/grown/coconut/attack_self(mob/user)
- if (opened == TRUE)
- if(possible_transfer_amounts.len)
- var/i=0
- for(var/A in possible_transfer_amounts)
- i++
- if(A == amount_per_transfer_from_this)
- if(i[src]'s transfer amount is now [amount_per_transfer_from_this] units.")
- return
+ if (!opened)
+ return
+
+ if(!possible_transfer_amounts.len)
+ return
+ var/i=0
+ for(var/A in possible_transfer_amounts)
+ i++
+ if(A != amount_per_transfer_from_this)
+ continue
+ if(i[src]'s transfer amount is now [amount_per_transfer_from_this] units.")
+ return
/obj/item/reagent_containers/food/snacks/grown/coconut/attackby(obj/item/W, mob/user, params)
//DEFUSING NADE LOGIC
- if (W.tool_behaviour == TOOL_WIRECUTTER && fused == TRUE)
- user.show_message("You cut the fuse!", 1)
+ if (W.tool_behaviour == TOOL_WIRECUTTER && fused)
+ user.visible_message("[user] cuts something from the coconut.", "You cut the fuse!")
playsound(user, W.hitsound, 50, 1, -1)
icon_state = "coconut_carved"
desc = "A coconut. This one's got a hole in it."
@@ -361,14 +367,14 @@
set_light(0, 0.0)
return
//IGNITING NADE LOGIC
- if(fusedactive == FALSE && fused == TRUE)
+ if(!fusedactive && fused)
var/lighting_text = W.ignition_effect(src, user)
if(lighting_text)
- user.visible_message("[user] ignites [src]'s fuse!", "You ignite the [src]'s fuse!")
+ user.visible_message("[user] ignites a fuse from [src]!", "You ignite the [src]'s fuse!")
fusedactive = TRUE
defused = FALSE
playsound(src, 'sound/effects/fuse.ogg', 100, 0)
- message_admins("[ADMIN_LOOKUPFLW(user)] ignited a coconut bomb for detonation at [ADMIN_VERBOSEJMP(user)] "+ pretty_string_from_reagent_list(reagents.reagent_list))
+ message_admins("[ADMIN_LOOKUPFLW(user)] ignited a coconut bomb for detonation at [ADMIN_VERBOSEJMP(user)] [pretty_string_from_reagent_list(reagents.reagent_list)]")
log_game("[key_name(user)] primed a coconut grenade for detonation at [AREACOORD(user)].")
addtimer(CALLBACK(src, .proc/prime), 5 SECONDS)
icon_state = "coconut_grenade_active"
@@ -380,7 +386,7 @@
//ADDING A FUSE, NADE LOGIC
if (istype(W,/obj/item/stack/sheet/cloth) || istype(W,/obj/item/stack/sheet/durathread))
- if (carved == TRUE && straw == FALSE && fused == FALSE)
+ if (carved && !straw && !fused)
user.show_message("You add a fuse to the coconut!", 1)
W.use(1)
fused = TRUE
@@ -389,38 +395,31 @@
name = "coconut bomb"
return
//ADDING STRAW LOGIC
- if (istype(W,/obj/item/stack/sheet/mineral/bamboo) && opened == TRUE && straw == FALSE && fused == FALSE)
+ if (istype(W,/obj/item/stack/sheet/mineral/bamboo) && opened && !straw && fused)
user.show_message("You add a bamboo straw to the coconut!", 1)
straw = TRUE
W.use(1)
icon_state += "_straw"
desc = "You can already feel like you're on a tropical vacation."
+ return
//OPENING THE NUT LOGIC
- if (carved == FALSE && chopped == FALSE)
- if(W.tool_behaviour == TOOL_SCREWDRIVER)
- user.show_message("You make a hole in the coconut!", 1)
+ if (!carved && !chopped)
+ var/screwdrivered = W.tool_behaviour == TOOL_SCREWDRIVER
+ if(screwdrivered || W.sharpness)
+ user.show_message("You [screwdrivered ? "make a hole in the coconut" : "slice the coconut open"]!", 1)
carved = TRUE
opened = TRUE
+ spillable = !screwdrivered
reagent_flags = OPENCONTAINER
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
- icon_state = "coconut_carved"
- desc = "A coconut. This one's got a hole in it."
- playsound(user, W.hitsound, 50, 1, -1)
- return
- else if(W.sharpness)
- user.show_message("You slice the coconut open!", 1)
- chopped = TRUE
- opened = TRUE
- reagent_flags = OPENCONTAINER
- ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
- spillable = TRUE
- icon_state = "coconut_chopped"
- desc = "A coconut. This one's sliced open, with all its delicious contents for your eyes to savour."
+ icon_state = screwdrivered ? "coconut_carved" : "coconut_chopped"
+ desc = "A coconut. [screwdrivered ? "This one's got a hole in it" : "This one's sliced open, with all its delicious contents for your eyes to savour"]."
playsound(user, W.hitsound, 50, 1, -1)
return
+ return ..()
/obj/item/reagent_containers/food/snacks/grown/coconut/attack(mob/living/M, mob/user, obj/target)
- if(M && user.a_intent == INTENT_HARM && spillable == FALSE)
+ if(M && user.a_intent == INTENT_HARM && !spillable)
var/obj/item/bodypart/affecting = user.zone_selected //Find what the player is aiming at
if (affecting == BODY_ZONE_HEAD && prob(15))
//smash the nut open
@@ -435,11 +434,11 @@
//Display an attack message.
if(M != user)
- M.visible_message("[user] has cracked open a [src.name] on [M]'s head!", \
- "[user] has cracked open a [src.name] on [M]'s head!")
+ M.visible_message("[user] has cracked open a [name] on [M]'s head!", \
+ "[user] has cracked open a [name] on [M]'s head!")
else
- user.visible_message("[M] cracks open a [src.name] on their [M.p_them()] head!", \
- "[M] cracks open a [src.name] on [M.p_their()] head!")
+ user.visible_message("[M] cracks open a [name] on their [M.p_them()] head!", \
+ "[M] cracks open a [name] on [M.p_their()] head!")
//The coconut breaks open so splash its reagents
spillable = TRUE
@@ -454,7 +453,7 @@
if(fusedactive)
return
- if(opened == FALSE)
+ if(!opened)
return
if(!canconsume(M, user))
@@ -489,21 +488,11 @@
M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.")
log_combat(user, M, "fed", reagents.log_list())
else
- if(M != user)
- M.visible_message("[user] attempts to feed something to [M].",
- "[user] attempts to feed something to you.")
- if(!do_mob(user, M))
- return
- if(!reagents || !reagents.total_volume)
- return // The drink might be empty after the delay, such as by spam-feeding
- M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.")
- log_combat(user, M, "fed", reagents.log_list())
- else
- to_chat(user, "You swallow a gulp of [src].")
- var/fraction = min(5/reagents.total_volume, 1)
- reagents.reaction(M, INGEST, fraction)
- addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5)
- playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ to_chat(user, "You swallow a gulp of [src].")
+ var/fraction = min(5/reagents.total_volume, 1)
+ reagents.reaction(M, INGEST, fraction)
+ addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5)
+ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
/obj/item/reagent_containers/food/snacks/grown/coconut/afterattack(obj/target, mob/user, proximity)
. = ..()
@@ -549,15 +538,13 @@
transform *= TRANSFORM_USING_VARIABLE(40, 100) + 0.5 //temporary fix for size?
/obj/item/reagent_containers/food/snacks/grown/coconut/proc/prime()
- if (!defused)
- var/turf/T = get_turf(src)
- reagents.chem_temp = 1000
- //Disable seperated contents when the grenade primes
- if (seed.get_gene(/datum/plant_gene/trait/noreact))
- DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
- reagents.handle_reactions()
- log_game("Coconut bomb detonation at [AREACOORD(T)], location [loc]")
- qdel(src)
+ if (defused)
+ return
+ var/turf/T = get_turf(src)
+ reagents.chem_temp = 1000
+ reagents.handle_reactions()
+ log_game("Coconut bomb detonation at [AREACOORD(T)], location [loc]")
+ qdel(src)
/obj/item/reagent_containers/food/snacks/grown/coconut/ex_act(severity)
qdel(src)
@@ -567,3 +554,34 @@
prime()
if(!QDELETED(src))
qdel(src)
+
+/obj/item/seeds/aloe
+ name = "pack of aloe seeds"
+ desc = "These seeds grow into aloe."
+ icon_state = "seed-aloe"
+ species = "aloe"
+ plantname = "Aloe"
+ product = /obj/item/reagent_containers/food/snacks/grown/aloe
+ lifespan = 60
+ endurance = 25
+ maturation = 4
+ production = 4
+ yield = 6
+ growthstages = 5
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05)
+
+/obj/item/reagent_containers/food/snacks/grown/aloe
+ seed = /obj/item/seeds/aloe
+ name = "aloe"
+ desc = "Cut leaves from the aloe plant."
+ icon_state = "aloe"
+ filling_color = "#90EE90"
+ bitesize_mod = 5
+ foodtype = VEGETABLES
+ juice_results = list(/datum/reagent/consumable/aloejuice = 0)
+ distill_reagent = /datum/reagent/consumable/ethanol/tequila
+
+/obj/item/reagent_containers/food/snacks/grown/aloe/microwave_act(obj/machinery/microwave/M)
+ new /obj/item/stack/medical/aloe(drop_location(), 2)
+ qdel(src)
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index 86742109..0083e363 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -22,6 +22,37 @@
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
reagents_add = list(/datum/reagent/medicine/morphine = 0.35, /datum/reagent/medicine/charcoal = 0.35, /datum/reagent/consumable/nutriment = 0)
+ mutatelist = list(/obj/item/seeds/reishi/negative)
+
+/*
+/obj/item/seeds/reishi/dark
+ name = "pack of dark reishi mycelium"
+ desc = "This mycelium grows into something that'll put you into a trance."
+ plantname = "Dark Reishi"
+ lifespan = 2
+ endurance = 8
+ maturation = 6
+ production = 1
+ yield = 0
+ potency = 0
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/modified_color/bw)
+ reagents_add = list(/datum/reagent/medicine/morphine = 0.2, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.02)
+ mutatelist = list(/obj/item/seeds/reishi/negative)
+*/
+
+/obj/item/seeds/reishi/negative
+ name = "pack of light-abosrbing reishi mycelium"
+ desc = "This mycelium grows into something so tranquil, you'll never want to wake up from its trance."
+ plantname = "Light-Absorbing Reishi"
+ lifespan = 1
+ endurance = 2 //Better use that enduro grow
+ maturation = 10
+ production = 6
+ yield = 0
+ potency = 0
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/modified_color)
+ reagents_add = list(/datum/reagent/medicine/morphine = 0.2, /datum/reagent/toxin/amanitin = 0.05, /datum/reagent/consumable/nutriment = 0.04, /datum/reagent/consumable/nutriment/vitamin = 0.02)
+ mutatelist = list(/obj/item/seeds/reishi)
/obj/item/reagent_containers/food/snacks/grown/mushroom/reishi
seed = /obj/item/seeds/reishi
@@ -173,7 +204,7 @@
to_chat(user, "You plant the walking mushroom.")
// Chanterelle
-/obj/item/seeds/chanter
+/obj/item/seeds/chanterelle
name = "pack of chanterelle mycelium"
desc = "This mycelium grows into chanterelle mushrooms."
icon_state = "mycelium-chanter"
@@ -190,10 +221,10 @@
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
reagents_add = list(/datum/reagent/consumable/nutriment = 0.1)
- mutatelist = list(/obj/item/seeds/chanterelle/jupitercup)
+ mutatelist = list(/obj/item/seeds/chanterelle/jupitercup, /obj/item/seeds/chanterelle/jupitercup/monochrome)
/obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle
- seed = /obj/item/seeds/chanter
+ seed = /obj/item/seeds/chanterelle
name = "chanterelle cluster"
desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!"
icon_state = "chanterelle"
@@ -215,12 +246,43 @@
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/reagent/fragile/teslium, /datum/plant_gene/trait/plant_type/carnivory)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
reagents_add = list(/datum/reagent/consumable/nutriment = 0.1)
+ mutatelist = list()
/obj/item/seeds/chanterelle/jupitercup/Initialize(mapload, nogenes = FALSE)
. = ..()
if(!nogenes)
unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE)
+/obj/item/seeds/chanterelle/jupitercup/hollow
+ name = "pack of hollow-cup mycelium"
+ desc = "This mycelium grows into hollow-cup mushrooms. These mushrooms require only the upmost attention."
+ plantname = "Hollow-cup Mushrooms"
+ lifespan = 1 //starts decaying before it can even be harvested once
+ production = 4
+ endurance = 5
+ yield = 0
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/plant_type/carnivory, /datum/plant_gene/trait/modified_color/transparent)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment = 0.1)
+ mutatelist = list(/obj/item/seeds/chanterelle/jupitercup, /obj/item/seeds/chanterelle/jupitercup/monochrome)
+ color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, -0.3,-0.3,-0.3,0.7, 0,0,0,0)
+ modified_colors = TRUE
+
+/obj/item/seeds/chanterelle/jupitercup/monochrome
+ name = "pack of silver-cup mycelium"
+ desc = "This mycelium grows into silver-cup mushrooms. These mushrooms require only the upmost attention."
+ plantname = "Silver-cup Mushrooms"
+ lifespan = 1
+ production = 5
+ endurance = 7
+ yield = 0
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/plant_type/carnivory, /datum/plant_gene/trait/modified_color/monochrome)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/nothing = 0.02)
+ mutatelist = list(/obj/item/seeds/chanterelle/jupitercup, /obj/item/seeds/chanterelle/jupitercup/hollow)
+ color = list(0.5,0.5,0.5,0, 0.5,0.5,0.5,0, 0.5,0.5,0.5,0, 0,0,0,1, 0,0,0,0)
+ modified_colors = TRUE
+
/obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup
seed = /obj/item/seeds/chanterelle/jupitercup
name = "jupiter cup"
@@ -385,6 +447,19 @@
product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ mutatelist = list(/obj/item/seeds/lavaland/inocybe/magenta)
+
+/obj/item/seeds/lavaland/inocybe/magenta
+ name = "pack of dilated inocybe mycelium"
+ desc = "This mycelium grows into a specially-colored inocybe mushroom, their shifted cells make them appear red."
+ plantname = "Red Inocybe Mushrooms"
+ lifespan = 4
+ endurance = 5
+ maturation = 3
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/modified_color/monochrome/red)
+ mutatelist = list()
+ color = list(0.8,0,0,0, 0.8,0.5,0.5,0, 0.8,0.5,0.5,0, 0,0,0,1, 0,0,0,0)
+ modified_colors = TRUE
// Embershroom (Mushroom stem)
@@ -397,3 +472,18 @@
product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/glow)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ mutatelist = list(/obj/item/seeds/lavaland/ember/cyan)
+
+/obj/item/seeds/lavaland/ember/cyan
+ name = "pack of dilated embershroom mycelium"
+ desc = "This mycelium grows into a specially-colored embershroom mushroom, their shifted cells make them appear blue."
+ plantname = "Blue Embershroom Mushrooms"
+ lifespan = 6
+ endurance = 10
+ maturation = 4
+ yield = 2
+ potency = 25
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/glow/blue, /datum/plant_gene/trait/modified_color/monochrome/blue)
+ mutatelist = list()
+ color = list(0.5,0.5,0.8,0, 0.5,0.5,0.8,0, 0,0,0.8,0, 0,0,0,1, 0,0,0,0)
+ modified_colors = TRUE
diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm
index 2ebaa6d5..a75b9caf 100644
--- a/code/modules/hydroponics/grown/onion.dm
+++ b/code/modules/hydroponics/grown/onion.dm
@@ -14,7 +14,7 @@
weed_chance = 3
growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1)
- mutatelist = list(/obj/item/seeds/onion/red)
+ mutatelist = list(/obj/item/seeds/onion/red, /obj/item/seeds/garlic)
/obj/item/reagent_containers/food/snacks/grown/onion
seed = /obj/item/seeds/onion
diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm
new file mode 100644
index 00000000..da5f57ce
--- /dev/null
+++ b/code/modules/hydroponics/grown/peas.dm
@@ -0,0 +1,99 @@
+// Finally, peas. Base plant.
+/obj/item/seeds/peas
+ name = "pack of pea pods"
+ desc = "These seeds grows into vitamin rich peas!"
+ icon_state = "seed-peas"
+ species = "peas"
+ plantname = "Pea Vines"
+ product = /obj/item/reagent_containers/food/snacks/grown/peas
+ maturation = 3
+ potency = 25
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_grow = "peas-grow"
+ icon_dead = "peas-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/peas/laugh)
+ reagents_add = list (/datum/reagent/consumable/nutriment/vitamin = 0.1, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/water = 0.05)
+
+
+/obj/item/reagent_containers/food/snacks/grown/peas
+ seed = /obj/item/seeds/peas
+ name = "peapod"
+ desc = "Finally... peas."
+ icon_state = "peas"
+ filling_color = "#739122"
+ bitesize_mod = 1
+ foodtype = VEGETABLES
+ tastes = list ("peas" = 1, "chalky saltiness" = 1)
+ distill_reagent = /datum/reagent/saltpetre
+
+
+// Laughin' Peas
+/obj/item/seeds/peas/laugh
+ name = "pack of laughin' peas"
+ desc = "These seeds give off a very soft purple glow.. they should grow into Laughin' Peas."
+ icon_state = "seed-laughpeas"
+ species = "laughpeas"
+ plantname = "Laughin' Peas"
+ product = /obj/item/reagent_containers/food/snacks/grown/laugh
+ maturation = 7
+ potency = 10
+ yield = 7
+ production = 5
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_grow = "laughpeas-grow"
+ icon_dead = "laughpeas-dead"
+ genes = list (/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/purple)
+ mutatelist = list (/obj/item/seeds/peas/laugh/peace)
+ reagents_add = list (/datum/reagent/consumable/laughter = 0.05, /datum/reagent/consumable/sugar = 0.05, /datum/reagent/consumable/nutriment = 0.07)
+ rarity = 25 //It actually might make CC Officials loosen up a smidge, eh?
+
+
+/obj/item/reagent_containers/food/snacks/grown/laugh
+ seed = /obj/item/seeds/peas/laugh
+ name = "pod of laughin' peas"
+ desc = "Ridens Cicer, guaranteed to improve your mood dramatically upon consumption!"
+ icon_state = "laughpeas"
+ filling_color = "#ee7bee"
+ bitesize_mod = 2
+ foodtype = VEGETABLES
+ juice_results = list (/datum/reagent/consumable/laughsyrup = 0)
+ tastes = list ("a prancing rabbit" = 1) //Vib Ribbon sends her regards.. wherever she is.
+ wine_power = 90
+ wine_flavor = "a vector-graphic rabbit dancing on your tongue"
+
+
+// World Peas - Peace at last, peace at last...
+/obj/item/seeds/peas/laugh/peace
+ name = "pack of world peas"
+ desc = "These rather large seeds give off a soothing blue glow..."
+ icon_state = "seed-worldpeas"
+ species = "worldpeas"
+ plantname = "World Peas"
+ product = /obj/item/reagent_containers/food/snacks/grown/peace
+ maturation = 20
+ potency = 75
+ yield = 1
+ production = 10
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_grow = "worldpeas-grow"
+ icon_dead = "worldpeas-dead"
+ genes = list (/datum/plant_gene/trait/glow/blue)
+ reagents_add = list (/datum/reagent/pax = 0.1, /datum/reagent/drug/happiness = 0.1, /datum/reagent/consumable/nutriment = 0.15)
+ rarity = 50
+
+
+/obj/item/reagent_containers/food/snacks/grown/peace
+ seed = /obj/item/seeds/peas/laugh/peace
+ name = "cluster of world peas"
+ desc = "A plant discovered through extensive genetic engineering, and iterative graft work. It's rumored to bring peace to any who consume it. In the wider AgSci community, it's attained the nickname of 'Pax Mundi'." //at last... world peas. I'm not sorry.
+ icon_state = "worldpeas"
+ filling_color = "#0099CC"
+ bitesize_mod = 4
+ foodtype = VEGETABLES
+ tastes = list ("numbing tranquility" = 2, "warmth" = 1)
+ wine_power = 100
+ wine_flavor = "mind-numbing peace and warmth"
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 3769f9ea..46a5f79a 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -29,6 +29,28 @@
create_reagents(volume, INJECTABLE | DRAWABLE)
+/obj/item/seeds/replicapod/pre_attack(obj/machinery/hydroponics/I)
+ if(istype(I, /obj/machinery/hydroponics))
+ if(!I.myseed)
+ START_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/seeds/replicapod/proc/check_mind_orbiting(atom/A)
+ for(var/mob/M in A.orbiters?.orbiters)
+ if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == DEAD && !M.suiciding && isobserver(M))
+ return TRUE
+ return FALSE
+
+/obj/item/seeds/replicapod/process()
+ var/obj/machinery/hydroponics/parent = loc
+ if(parent.harvest != 1)
+ return
+ if (check_mind_orbiting(parent))
+ icon_harvest = "replicapod-orbit"
+ else
+ icon_harvest = "replicapod-harvest"
+ parent.update_icon_plant()
+
/obj/item/seeds/replicapod/on_reagent_change(changetype)
if(changetype == ADD_REAGENT)
var/datum/reagent/blood/B = reagents.has_reagent(/datum/reagent/blood)
@@ -59,8 +81,11 @@
/obj/item/seeds/replicapod/get_analyzer_text()
var/text = ..()
+ var/obj/machinery/hydroponics/parent = loc
if(contains_sample)
text += "\n It contains a blood sample!"
+ if (parent && istype(parent) && check_mind_orbiting(parent))
+ text += "\n The soul is ready to enter the body."
return text
diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm
index 1e2d25d8..e785c7dc 100644
--- a/code/modules/hydroponics/grown/tobacco.dm
+++ b/code/modules/hydroponics/grown/tobacco.dm
@@ -41,4 +41,4 @@
desc = "Dry them out to make some space-smokes."
icon_state = "stobacco_leaves"
distill_reagent = null
- wine_power = 50
\ No newline at end of file
+ wine_power = 50
diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm
index 53c33896..d3525c95 100644
--- a/code/modules/hydroponics/grown/tomato.dm
+++ b/code/modules/hydroponics/grown/tomato.dm
@@ -36,7 +36,7 @@
plantname = "Blood-Tomato Plants"
product = /obj/item/reagent_containers/food/snacks/grown/tomato/blood
mutatelist = list()
- reagents_add = list(/datum/reagent/blood = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1)
+ reagents_add = list(/datum/reagent/blood/tomato = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1)
rarity = 20
/obj/item/reagent_containers/food/snacks/grown/tomato/blood
@@ -47,7 +47,7 @@
splat_type = /obj/effect/gibspawner/generic
filling_color = "#FF0000"
foodtype = FRUIT | GROSS
- grind_results = list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood = 0)
+ grind_results = list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood/tomato = 0)
distill_reagent = /datum/reagent/consumable/ethanol/bloody_mary
// Blue Tomato
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 36be0a4b..267e41db 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -314,6 +314,9 @@
else if(istype(A, /obj/item) && prob(20))
var/obj/item/O = A
O.microwave_act()
+ else if(istype(A, /obj/item/grown/log))
+ qdel(A)
+ new /obj/item/stack/sheet/mineral/coal(loc, 1)
/obj/structure/bonfire/process()
if(!CheckOxygen())
diff --git a/code/modules/hydroponics/hydro_chemreact.dm b/code/modules/hydroponics/hydro_chemreact.dm
new file mode 100644
index 00000000..7c89909a
--- /dev/null
+++ b/code/modules/hydroponics/hydro_chemreact.dm
@@ -0,0 +1,262 @@
+/obj/machinery/hydroponics/proc/applyChemicals(datum/reagents/S, mob/user)
+ if(!myseed)
+ return
+ myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines
+
+ // Requires 5 mutagen to possibly change species.// Poor man's mutagen.
+ if(S.has_reagent(/datum/reagent/toxin/mutagen, 5) || S.has_reagent(/datum/reagent/radium, 10) || S.has_reagent(/datum/reagent/uranium, 10))
+ switch(rand(100))
+ if(91 to 100)
+ adjustHealth(-10)
+ to_chat(user, "The plant shrivels and burns.")
+ if(81 to 90)
+ mutatespecie()
+ if(66 to 80)
+ hardmutate()
+ if(41 to 65)
+ mutate()
+ if(21 to 41)
+ to_chat(user, "The plants don't seem to react...")
+ if(11 to 20)
+ mutateweed()
+ if(1 to 10)
+ mutatepest(user)
+ else
+ to_chat(user, "Nothing happens...")
+
+ // 2 or 1 units is enough to change the yield and other stats.// Can change the yield and other stats, but requires more than mutagen
+ else if(S.has_reagent(/datum/reagent/toxin/mutagen, 2) || S.has_reagent(/datum/reagent/radium, 5) || S.has_reagent(/datum/reagent/uranium, 5))
+ hardmutate()
+ else if(S.has_reagent(/datum/reagent/toxin/mutagen, 1) || S.has_reagent(/datum/reagent/radium, 2) || S.has_reagent(/datum/reagent/uranium, 2))
+ mutate()
+
+
+ // After handling the mutating, we now handle the damage from adding crude radioactives...
+ if(S.has_reagent(/datum/reagent/uranium, 1))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/uranium) * 1))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/uranium) * 2))
+ if(S.has_reagent(/datum/reagent/radium, 1))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/radium) * 1))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/radium) * 3)) // Radium is harsher (OOC: also easier to produce)
+
+
+ // Nutriments
+ if(S.has_reagent(/datum/reagent/plantnutriment/eznutriment, 1))
+ yieldmod = 1
+ mutmod = 1
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/eznutriment) * 1))
+ if(S.has_reagent(/datum/reagent/plantnutriment/left4zednutriment, 1))
+ yieldmod = 0
+ mutmod = 2
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/left4zednutriment) * 1))
+ if(S.has_reagent(/datum/reagent/plantnutriment/robustharvestnutriment, 1))
+ yieldmod = 1.3
+ mutmod = 0
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/robustharvestnutriment) * 1))
+
+ if(S.has_reagent(/datum/reagent/plantnutriment/endurogrow, 1))
+ var/total_transferred = S.get_reagent_amount(/datum/reagent/plantnutriment/endurogrow)
+ if(total_transferred >= 20)
+ myseed.adjust_potency(-round(total_transferred / 10))
+ myseed.adjust_yield(-round(total_transferred / 20))
+ myseed.adjust_endurance(round(total_transferred / 30))
+ else
+ to_chat(user, "The plants don't seem to react...")
+
+ if(S.has_reagent(/datum/reagent/plantnutriment/liquidearthquake, 1))
+ var/total_transferred = S.get_reagent_amount(/datum/reagent/plantnutriment/liquidearthquake)
+ if(total_transferred >= 20)
+ myseed.adjust_weed_chance(round(total_transferred / 10))
+ myseed.adjust_weed_rate(round(total_transferred / 20))
+ myseed.adjust_production(-round(total_transferred / 30))
+ else
+ to_chat(user, "The plants don't seem to react...")
+
+ // Ambrosia Gaia produces earthsblood.
+ if(S.has_reagent(/datum/reagent/medicine/earthsblood))
+ self_sufficiency_progress += S.get_reagent_amount(/datum/reagent/medicine/earthsblood)
+ if(self_sufficiency_progress >= self_sufficiency_req)
+ become_self_sufficient()
+ else if(!self_sustaining)
+ to_chat(user, "[src] warms as it might on a spring day under a genuine Sun.")
+
+ // Antitoxin binds shit pretty well. So the tox goes significantly down
+ if(S.has_reagent(/datum/reagent/medicine/charcoal, 1))
+ adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/charcoal) * 2))
+
+ // Toxins, not good for anything
+ if(S.has_reagent(/datum/reagent/toxin, 1))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin) * 2))
+
+ // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth. Not shrooms though. I can't deal with this now...
+ if(S.has_reagent(/datum/reagent/consumable/milk, 1))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.1))
+ adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.9))
+
+ // Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay?
+ if(S.has_reagent(/datum/reagent/consumable/ethanol/beer, 1))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.05))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.25))
+ adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.7))
+
+ // Fluorine one of the most corrosive and deadly gasses
+ if(S.has_reagent(/datum/reagent/fluorine, 1))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 2))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/fluorine) * 2.5))
+ adjustWater(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 0.5))
+ adjustWeeds(-rand(1,4))
+
+ // Chlorine one of the most corrosive and deadly gasses
+ if(S.has_reagent(/datum/reagent/chlorine, 1))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 1))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/chlorine) * 1.5))
+ adjustWater(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 0.5))
+ adjustWeeds(-rand(1,3))
+
+ // White Phosphorous + water -> phosphoric acid. That's not a good thing really.
+ // Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much.
+ if(S.has_reagent(/datum/reagent/phosphorus, 1))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.75))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.1))
+ adjustWater(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.5))
+ adjustWeeds(-rand(1,2))
+
+ // Plants should not have sugar, they can't use it and it prevents them getting water/nutients, it is good for mold though...
+ if(S.has_reagent(/datum/reagent/consumable/sugar, 1))
+ adjustWeeds(rand(1,2))
+ adjustPests(rand(1,2))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sugar) * 0.1))
+
+ // It is water!
+ if(S.has_reagent(/datum/reagent/water, 1))
+ adjustWater(round(S.get_reagent_amount(/datum/reagent/water) * 1))
+
+ // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits~
+ if(S.has_reagent(/datum/reagent/water/holywater, 1))
+ adjustWater(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 1))
+ adjustHealth(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 0.1))
+
+ // A variety of nutrients are dissolved in club soda, without sugar.
+ // These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth.
+ if(S.has_reagent(/datum/reagent/consumable/sodawater, 1))
+ adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 1))
+ adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1))
+
+ // Sulphuric Acid
+ if(S.has_reagent(/datum/reagent/toxin/acid, 1))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1.5))
+ adjustWeeds(-rand(1,2))
+
+ // Acid
+ if(S.has_reagent(/datum/reagent/toxin/acid/fluacid, 1))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 2))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 3))
+ adjustWeeds(-rand(1,4))
+
+ // Plant-B-Gone is just as bad
+ if(S.has_reagent(/datum/reagent/toxin/plantbgone, 1))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 5))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 6))
+ adjustWeeds(-rand(4,8))
+
+ // Napalm, not known for being good for anything organic
+ if(S.has_reagent(/datum/reagent/napalm, 1))
+ if(!(myseed.resistance_flags & FIRE_PROOF))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/napalm) * 6))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/napalm) * 7))
+ adjustWeeds(-rand(5,9))
+
+ //Weed Spray
+ if(S.has_reagent(/datum/reagent/toxin/plantbgone/weedkiller, 1))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone/weedkiller) * 0.5))
+ //old toxicity was 4, each spray is default 10 (minimal of 5) so 5 and 2.5 are the new ammounts
+ adjustWeeds(-rand(1,2))
+
+ //Pest Spray
+ if(S.has_reagent(/datum/reagent/toxin/pestkiller, 1))
+ adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/pestkiller) * 0.5))
+ adjustPests(-rand(1,2))
+
+ // Healing
+ if(S.has_reagent(/datum/reagent/medicine/cryoxadone, 1))
+ adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3))
+ adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3))
+
+ // Ammonia is bad ass.
+ if(S.has_reagent(/datum/reagent/ammonia, 1))
+ adjustHealth(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.5))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/ammonia) * 1))
+ if(myseed)
+ myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.01))
+
+ // Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants
+ if(S.has_reagent(/datum/reagent/saltpetre, 1))
+ var/salt = S.get_reagent_amount(/datum/reagent/saltpetre)
+ adjustHealth(round(salt * 0.25))
+ if (myseed)
+ myseed.adjust_production(-round(salt/100)-prob(salt%100))
+ myseed.adjust_potency(round(salt*0.5))
+ // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer
+ if(S.has_reagent(/datum/reagent/ash, 1))
+ adjustHealth(round(S.get_reagent_amount(/datum/reagent/ash) * 0.25))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/ash) * 0.5))
+ adjustWeeds(-1)
+
+ // Diethylamine is more bad ass, and pests get hurt by the corrosive nature of it, not the plant.
+ if(S.has_reagent(/datum/reagent/diethylamine, 1))
+ adjustHealth(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 1))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 2))
+ if(myseed)
+ myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 0.02))
+ adjustPests(-rand(1,2))
+
+ // Enduro Grow sacrifices potency + yield for endurance
+ if(S.has_reagent(/datum/reagent/plantnutriment/endurogrow, 1))
+ myseed.adjust_potency(-round(S.get_reagent_amount(/datum/reagent/plantnutriment/endurogrow) * 0.1))
+ myseed.adjust_yield(-round(S.get_reagent_amount(/datum/reagent/plantnutriment/endurogrow) * 0.075))
+ myseed.adjust_endurance(round(S.get_reagent_amount(/datum/reagent/plantnutriment/endurogrow) * 0.35))
+
+ // Liquid Earthquake increases production speed but increases weeds
+ if(S.has_reagent(/datum/reagent/plantnutriment/liquidearthquake, 1))
+ myseed.adjust_weed_rate(round(S.get_reagent_amount(/datum/reagent/plantnutriment/liquidearthquake) * 0.1))
+ myseed.adjust_weed_chance(round(S.get_reagent_amount(/datum/reagent/plantnutriment/liquidearthquake) * 0.3))
+ myseed.adjust_production(round(S.get_reagent_amount(/datum/reagent/plantnutriment/liquidearthquake) * 0.075))
+
+ // Nutriment Compost, effectively
+ if(S.has_reagent(/datum/reagent/consumable/nutriment, 1))
+ adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 0.5))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 1))
+
+ // Virusfood Compost for EVERYTHING
+ if(S.has_reagent(/datum/reagent/toxin/mutagen/mutagenvirusfood, 1))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/toxin/mutagen/mutagenvirusfood) * 0.5))
+ adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/mutagen/mutagenvirusfood) * 0.5))
+
+ // Blood
+ if(S.has_reagent(/datum/reagent/blood, 1))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/blood) * 1))
+ adjustPests(rand(2,4))
+
+ // Strange reagent
+ if(S.has_reagent(/datum/reagent/medicine/strange_reagent, 1))
+ spawnplant()
+
+ // Adminordrazine the best stuff there is. For testing/debugging.
+ if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 1))
+ adjustWater(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1))
+ adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1))
+ adjustNutri(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1))
+ adjustPests(-rand(1,5))
+ adjustWeeds(-rand(1,5))
+ if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 5))
+ switch(rand(100))
+ if(66 to 100)
+ mutatespecie()
+ if(33 to 65)
+ mutateweed()
+ if(1 to 32)
+ mutatepest(user)
+ else
+ to_chat(user, "Nothing happens...")
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index 9655b138..ad5d2d76 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -10,6 +10,12 @@
w_class = WEIGHT_CLASS_TINY
slot_flags = ITEM_SLOT_BELT
materials = list(MAT_METAL=30, MAT_GLASS=20)
+ var/scan_mode = FALSE
+
+/obj/item/plant_analyzer/attack_self(mob/user)
+ . = ..()
+ scan_mode = !scan_mode
+ to_chat(user, "You switch [src] to [scan_mode ? "scan for chemical reagents and traits" : "scan for plant growth statistics"].")
// *************************************
// Hydroponics Tools
@@ -192,4 +198,56 @@
/obj/item/reagent_containers/glass/bottle/killer/pestkiller
name = "bottle of pest spray"
desc = "Contains a pesticide."
- list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
\ No newline at end of file
+ list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
+
+/*
+/obj/item/plant_debugger
+ name = "plant debugger"
+ desc = "You should never be able to see this."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "hydro"
+ flags_1 = ABSTRACT
+ var/mode = 0
+ var/list/traits_list = list(
+ /datum/plant_gene/trait/modified_color/monochrome/yellow,
+ /datum/plant_gene/trait/modified_color/monochrome/green,
+ /datum/plant_gene/trait/modified_color/vibrant,
+ /datum/plant_gene/trait/modified_color/random,
+ /datum/plant_gene/trait/modified_color/monochrome/dark/,
+ /datum/plant_gene/trait/modified_color/monochrome/dark/red,
+ /datum/plant_gene/trait/modified_color/monochrome/dark/green,
+ /datum/plant_gene/trait/modified_color/monochrome/dark/blue)
+ var/trait_to_add = null
+
+/obj/item/plant_debugger/attack_self(mob/user)
+ . = ..()
+ mode++
+ if(mode > traits_list.len)
+ mode = 1
+ trait_to_add = traits_list[mode]
+ to_chat(user, "Now injecting: [trait_to_add]")
+
+/obj/item/plant_debugger/pre_attack(atom/A, mob/living/user, params)
+ if(!istype(A, /obj/machinery/hydroponics))
+ return
+ var/obj/machinery/hydroponics/H = A
+ if(!H.myseed)
+ to_chat(user, "This tray does not have a seed in it!")
+ return
+ for(var/G in H.myseed.genes)
+ if(istype(G, /datum/plant_gene/trait/modified_color))
+ var/datum/plant_gene/trait/T = new trait_to_add
+ G = T
+ T.apply_vars(H.myseed)
+ H.update_icon()
+ to_chat(user, "Converted old modified_color to [trait_to_add]")
+ return
+ var/datum/plant_gene/trait/T = new trait_to_add
+ H.myseed.genes += T
+ T.apply_vars(H.myseed)
+ H.update_icon()
+ to_chat(user, "Added [trait_to_add]")
+
+/obj/item/plant_debugger/attack()
+ return
+*/
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 9c594260..70e1280e 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -6,45 +6,52 @@
pixel_z = 8
obj_flags = CAN_BE_HIT | UNIQUE_RENAME
circuit = /obj/item/circuitboard/machine/hydroponics
- var/waterlevel = 100 //The amount of water in the tray (max 100)
+ var/waterlevel = 100 //The amount of water in the tray
var/maxwater = 100 //The maximum amount of water in the tray
- var/nutrilevel = 10 //The amount of nutrient in the tray (max 10)
+ var/nutrilevel = 10 //The amount of nutrient in the tray
var/maxnutri = 10 //The maximum nutrient of water in the tray
- var/pestlevel = 0 //The amount of pests in the tray (max 10)
- var/weedlevel = 0 //The amount of weeds in the tray (max 10)
+ var/pestlevel = 0 //The amount of pests in the tray
+ var/weedlevel = 0 //The amount of weeds in the tray
var/yieldmod = 1 //Nutriment's effect on yield
var/mutmod = 1 //Nutriment's effect on mutations
var/toxic = 0 //Toxicity in the tray?
var/age = 0 //Current age
- var/dead = 0 //Is it dead?
+ var/dead = FALSE //Is it dead?
var/plant_health //Its health
var/lastproduce = 0 //Last time it was harvested
var/lastcycle = 0 //Used for timing of cycles.
var/cycledelay = 200 //About 10 seconds / cycle
- var/harvest = 0 //Ready to harvest?
+ var/harvest = FALSE //Ready to harvest?
var/obj/item/seeds/myseed = null //The currently planted seed
var/rating = 1
- var/unwrenchable = 1
+ var/unwrenchable = TRUE
var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
+ var/mob/lastuser //Last user to add reagents to a tray. Mostly for logging.
+ var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood.
var/self_sufficiency_progress = 0
- var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
-
/obj/machinery/hydroponics/constructable
name = "hydroponics tray"
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "hydrotray3"
+/obj/machinery/hydroponics/constructable/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
+
+/obj/machinery/hydroponics/constructable/proc/can_be_rotated(mob/user, rotation_type)
+ return !anchored
+
/obj/machinery/hydroponics/constructable/RefreshParts()
var/tmp_capacity = 0
for (var/obj/item/stock_parts/matter_bin/M in component_parts)
tmp_capacity += M.rating
for (var/obj/item/stock_parts/manipulator/M in component_parts)
rating = M.rating
- maxwater = tmp_capacity * 50 // Up to 300
- maxnutri = tmp_capacity * 5 // Up to 30
+ maxwater = tmp_capacity * 50 // Up to 400
+ maxnutri = tmp_capacity * 5 // Up to 40 Maximum
/obj/machinery/hydroponics/Destroy()
if(myseed)
@@ -57,12 +64,7 @@
// handle opening the panel
if(default_deconstruction_screwdriver(user, icon_state, icon_state, I))
return
-
- // handle deconstructing the machine, if permissible
- if (I.tool_behaviour == TOOL_CROWBAR && using_irrigation)
- to_chat(user, "Disconnect the hoses first!")
- return
- else if(default_deconstruction_crowbar(I))
+ if(default_deconstruction_crowbar(I))
return
return ..()
@@ -75,21 +77,22 @@
var/atom/a = processing_atoms[1]
for(var/step_dir in GLOB.cardinals)
var/obj/machinery/hydroponics/h = locate() in get_step(a, step_dir)
- // Soil plots aren't dense
+
if(h && h.using_irrigation && h.density && !(h in connected) && !(h in processing_atoms))
processing_atoms += h
+
processing_atoms -= a
connected += a
return connected
-
/obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
if(!myseed)
return ..()
if(istype(Proj , /obj/item/projectile/energy/floramut))
mutate()
+ return BULLET_ACT_HIT
else if(istype(Proj , /obj/item/projectile/energy/florayield))
return myseed.bullet_act(Proj)
else
@@ -104,7 +107,7 @@
if(self_sustaining)
adjustNutri(1)
adjustWater(rand(3,5))
- adjustWeeds(-2)
+ adjustWeeds(-4) //Was -2. People keep getting confused as to why gaia isn't completely removing weeds
adjustPests(-2)
adjustToxic(-2)
@@ -118,10 +121,10 @@
needs_update = 1
+
//Nutrients//////////////////////////////////////////////////////////////
- // Nutrients deplete slowly
- if(prob(50))
- adjustNutri(-1 / rating)
+ // Nutrients should deplete at a constant rate
+ adjustNutri(-1 / rating)
// Lack of nutrients hurts non-weeds
if(nutrilevel <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
@@ -141,16 +144,19 @@
//Water//////////////////////////////////////////////////////////////////
// Drink random amount of water
- adjustWater(-rand(1,6) / rating)
+ if(waterlevel > 10)
+ adjustWater(-rand(3,4) / rating)
+ else
+ adjustWater(-1 / rating) //Deplete water slower if we're dry. Just for some realism
// If the plant is dry, it loses health pretty fast, unless mushroom
- if(waterlevel <= 10 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism))
+ if(waterlevel <= 15 && !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 but also spawns weeds
- else if(waterlevel > 10 && nutrilevel > 0)
+ else if(waterlevel > 15 && nutrilevel > 0)
adjustHealth(rand(1,2) / rating)
if(myseed && prob(myseed.weed_chance))
adjustWeeds(myseed.weed_rate)
@@ -204,13 +210,14 @@
// If the plant is too old, lose health fast
if(age > myseed.lifespan)
- adjustHealth(-rand(1,5) / rating)
+ adjustHealth(-rand(3,5) / rating)
// Harvest code
if(age > myseed.production && (age - lastproduce) > myseed.production && (!harvest && !dead))
- nutrimentMutation()
+ if(age > myseed.production*2) //Start mutating stats every process cycle if we can be harvested, only after a while
+ nutrimentMutation()
if(myseed && myseed.yield != -1) // Unharvestable shouldn't be harvested
- harvest = 1
+ harvest = TRUE
else
lastproduce = age
if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase
@@ -238,22 +245,22 @@
return
/obj/machinery/hydroponics/proc/nutrimentMutation()
- if (mutmod == 0)
- return
- if (mutmod == 1)
- if(prob(80)) //80%
- mutate()
- else if(prob(75)) //15%
- hardmutate()
- return
- if (mutmod == 2)
- if(prob(50)) //50%
- mutate()
- else if(prob(50)) //25%
- hardmutate()
- else if(prob(50)) //12.5%
- mutatespecie()
- return
+ switch (mutmod)
+
+ //0 does nothing
+
+ if(1)
+ if(prob(80))
+ mutate()
+ else if(prob(75)) //15%
+ hardmutate()
+ if(2)
+ if(prob(50))
+ mutate()
+ else if(prob(50)) //25%
+ hardmutate()
+ else if(prob(50)) //12.5%
+ mutatespecie()
return
/obj/machinery/hydroponics/update_icon()
@@ -301,8 +308,10 @@
else
plant_overlay.icon_state = myseed.icon_harvest
else
- var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages)
+ var/t_growthstate = clamp(round((age / myseed.maturation) * myseed.growthstages), 1, myseed.growthstages)
plant_overlay.icon_state = "[myseed.icon_grow][t_growthstate]"
+ if(myseed.modified_colors) //In case we get a different color from other things
+ plant_overlay.color = myseed.color
add_overlay(plant_overlay)
/obj/machinery/hydroponics/proc/update_icon_lights()
@@ -344,6 +353,9 @@
. += "It's filled with weeds!"
if(pestlevel >= 5)
. += "It's filled with tiny worms!"
+ to_chat(user, "" )
+
+
/obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, this happens.
dead = 0
@@ -364,7 +376,7 @@
if(10 to 11)
myseed = new /obj/item/seeds/amanita(src)
if(8 to 9)
- myseed = new /obj/item/seeds/chanter(src)
+ myseed = new /obj/item/seeds/chanterelle(src)
if(6 to 7)
myseed = new /obj/item/seeds/tower(src)
if(4 to 5)
@@ -379,7 +391,11 @@
pestlevel = 0 // Reset
update_icon()
visible_message("The [oldPlantName] is overtaken by some [myseed.plantname]!")
-
+ name = "hydroponics tray ([myseed.plantname])"
+ if(myseed.product)
+ desc = initial(myseed.product.desc)
+ else
+ desc = initial(desc)
/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)
@@ -413,7 +429,7 @@
sleep(5) // Wait a while
update_icon()
visible_message("[oldPlantName] suddenly mutates into [myseed.plantname]!")
-
+ name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name)
/obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant
if( weedlevel > 5 )
@@ -436,15 +452,14 @@
else
to_chat(usr, "The few weeds in [src] seem to react, but only for a moment...")
-
-/obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one function to make things easier
+/obj/machinery/hydroponics/proc/plantdies()
plant_health = 0
- harvest = 0
+ harvest = FALSE
pestlevel = 0 // Pests die
+ lastproduce = 0
if(!dead)
update_icon()
- dead = 1
-
+ dead = TRUE
/obj/machinery/hydroponics/proc/mutatepest(mob/user)
@@ -456,238 +471,6 @@
else
to_chat(user, "The pests seem to behave oddly, but quickly settle down...")
-/obj/machinery/hydroponics/proc/applyChemicals(datum/reagents/S, mob/user)
- if(myseed)
- myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines
-
- // Requires 5 mutagen to possibly change species.// Poor man's mutagen.
- if(S.has_reagent(/datum/reagent/toxin/mutagen, 5) || S.has_reagent(/datum/reagent/radium, 10) || S.has_reagent(/datum/reagent/uranium, 10))
- switch(rand(100))
- if(91 to 100)
- adjustHealth(-10)
- to_chat(user, "The plant shrivels and burns.")
- if(81 to 90)
- mutatespecie()
- if(66 to 80)
- hardmutate()
- if(41 to 65)
- mutate()
- if(21 to 41)
- to_chat(user, "The plants don't seem to react...")
- if(11 to 20)
- mutateweed()
- if(1 to 10)
- mutatepest(user)
- else
- to_chat(user, "Nothing happens...")
-
- // 2 or 1 units is enough to change the yield and other stats.// Can change the yield and other stats, but requires more than mutagen
- else if(S.has_reagent(/datum/reagent/toxin/mutagen, 2) || S.has_reagent(/datum/reagent/radium, 5) || S.has_reagent(/datum/reagent/uranium, 5))
- hardmutate()
- else if(S.has_reagent(/datum/reagent/toxin/mutagen, 1) || S.has_reagent(/datum/reagent/radium, 2) || S.has_reagent(/datum/reagent/uranium, 2))
- mutate()
-
- // After handling the mutating, we now handle the damage from adding crude radioactives...
- if(S.has_reagent(/datum/reagent/uranium, 1))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/uranium) * 1))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/uranium) * 2))
- if(S.has_reagent(/datum/reagent/radium, 1))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/radium) * 1))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/radium) * 3)) // Radium is harsher (OOC: also easier to produce)
-
- // Nutriments
- if(S.has_reagent(/datum/reagent/plantnutriment/eznutriment, 1))
- yieldmod = 1
- mutmod = 1
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/eznutriment) * 1))
-
- if(S.has_reagent(/datum/reagent/plantnutriment/left4zednutriment, 1))
- yieldmod = 0
- mutmod = 2
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/left4zednutriment) * 1))
-
- if(S.has_reagent(/datum/reagent/plantnutriment/robustharvestnutriment, 1))
- yieldmod = 1.3
- mutmod = 0
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/robustharvestnutriment) *1 ))
-
- // Ambrosia Gaia produces earthsblood.
- if(S.has_reagent(/datum/reagent/medicine/earthsblood))
- self_sufficiency_progress += S.get_reagent_amount(/datum/reagent/medicine/earthsblood)
- if(self_sufficiency_progress >= self_sufficiency_req)
- become_self_sufficient()
- else if(!self_sustaining)
- to_chat(user, "[src] warms as it might on a spring day under a genuine Sun.")
-
- // Antitoxin binds shit pretty well. So the tox goes significantly down
- if(S.has_reagent(/datum/reagent/medicine/charcoal, 1))
- adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/charcoal) * 2))
-
- // Toxins, not good for anything
- if(S.has_reagent(/datum/reagent/toxin, 1))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin) * 2))
-
- // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth. Not shrooms though. I can't deal with this now...
- if(S.has_reagent(/datum/reagent/consumable/milk, 1))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.1))
- adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.9))
-
- // Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay?
- if(S.has_reagent(/datum/reagent/consumable/ethanol/beer, 1))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.05))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.25))
- adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.7))
-
- // Fluorine one of the most corrosive and deadly gasses
- if(S.has_reagent(/datum/reagent/fluorine, 1))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 2))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/fluorine) * 2.5))
- adjustWater(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 0.5))
- adjustWeeds(-rand(1,4))
-
- // Chlorine one of the most corrosive and deadly gasses
- if(S.has_reagent(/datum/reagent/chlorine, 1))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 1))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/chlorine) * 1.5))
- adjustWater(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 0.5))
- adjustWeeds(-rand(1,3))
-
- // White Phosphorous + water -> phosphoric acid. That's not a good thing really.
- // Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much.
- if(S.has_reagent(/datum/reagent/phosphorus, 1))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.75))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.1))
- adjustWater(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.5))
- adjustWeeds(-rand(1,2))
-
- // Plants should not have sugar, they can't use it and it prevents them getting water/nutients, it is good for mold though...
- if(S.has_reagent(/datum/reagent/consumable/sugar, 1))
- adjustWeeds(rand(1,2))
- adjustPests(rand(1,2))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sugar) * 0.1))
-
- // It is water!
- if(S.has_reagent(/datum/reagent/water, 1))
- adjustWater(round(S.get_reagent_amount(/datum/reagent/water) * 1))
-
- // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits~
- if(S.has_reagent(/datum/reagent/water/holywater, 1))
- adjustWater(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 1))
- adjustHealth(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 0.1))
-
- // A variety of nutrients are dissolved in club soda, without sugar.
- // These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth.
- if(S.has_reagent(/datum/reagent/consumable/sodawater, 1))
- adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 1))
- adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1))
-
- // Sulphuric Acid
- if(S.has_reagent(/datum/reagent/toxin/acid, 1))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1.5))
- adjustWeeds(-rand(1,2))
-
- // Acid
- if(S.has_reagent(/datum/reagent/toxin/acid/fluacid, 1))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 2))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 3))
- adjustWeeds(-rand(1,4))
-
- // Plant-B-Gone is just as bad
- if(S.has_reagent(/datum/reagent/toxin/plantbgone, 1))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 5))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 6))
- adjustWeeds(-rand(4,8))
-
- // Napalm, not known for being good for anything organic
- if(S.has_reagent(/datum/reagent/napalm, 1))
- if(!(myseed.resistance_flags & FIRE_PROOF))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/napalm) * 6))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/napalm) * 7))
- adjustWeeds(-rand(5,9))
-
- //Weed Spray
- if(S.has_reagent(/datum/reagent/toxin/plantbgone/weedkiller, 1))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone/weedkiller) * 0.5))
- //old toxicity was 4, each spray is default 10 (minimal of 5) so 5 and 2.5 are the new ammounts
- adjustWeeds(-rand(1,2))
-
- //Pest Spray
- if(S.has_reagent(/datum/reagent/toxin/pestkiller, 1))
- adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/pestkiller) * 0.5))
- adjustPests(-rand(1,2))
-
- // Healing
- if(S.has_reagent(/datum/reagent/medicine/cryoxadone, 1))
- adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3))
- adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3))
-
- // Ammonia is bad ass.
- if(S.has_reagent(/datum/reagent/ammonia, 1))
- adjustHealth(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.5))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/ammonia) * 1))
- if(myseed)
- myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.01))
-
- // Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants
- if(S.has_reagent(/datum/reagent/saltpetre, 1))
- var/salt = S.get_reagent_amount(/datum/reagent/saltpetre)
- adjustHealth(round(salt * 0.25))
- if (myseed)
- myseed.adjust_production(-round(salt/100)-prob(salt%100))
- myseed.adjust_potency(round(salt*0.5))
- // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer
- if(S.has_reagent(/datum/reagent/ash, 1))
- adjustHealth(round(S.get_reagent_amount(/datum/reagent/ash) * 0.25))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/ash) * 0.5))
- adjustWeeds(-1)
-
- // Diethylamine is more bad ass, and pests get hurt by the corrosive nature of it, not the plant.
- if(S.has_reagent(/datum/reagent/diethylamine, 1))
- adjustHealth(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 1))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 2))
- if(myseed)
- myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 0.02))
- adjustPests(-rand(1,2))
-
- // Nutriment Compost, effectively
- if(S.has_reagent(/datum/reagent/consumable/nutriment, 1))
- adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 0.5))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 1))
-
- // Virusfood Compost for EVERYTHING
- if(S.has_reagent(/datum/reagent/toxin/mutagen/mutagenvirusfood, 1))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/toxin/mutagen/mutagenvirusfood) * 0.5))
- adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/mutagen/mutagenvirusfood) * 0.5))
-
- // Blood
- if(S.has_reagent(/datum/reagent/blood, 1))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/blood) * 1))
- adjustPests(rand(2,4))
-
- // Strange reagent
- if(S.has_reagent(/datum/reagent/medicine/strange_reagent, 1))
- spawnplant()
-
- // Adminordrazine the best stuff there is. For testing/debugging.
- if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 1))
- adjustWater(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1))
- adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1))
- adjustNutri(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1))
- adjustPests(-rand(1,5))
- adjustWeeds(-rand(1,5))
- if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 5))
- switch(rand(100))
- if(66 to 100)
- mutatespecie()
- if(33 to 65)
- mutateweed()
- if(1 to 32)
- mutatepest(user)
- else
- to_chat(user, "Nothing happens...")
-
/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params)
//Called when mob user "attacks" it with object O
if(istype(O, /obj/item/reagent_containers) ) // Syringe stuff (and other reagent containers now too)
@@ -710,6 +493,10 @@
var/transfer_amount
if(istype(reagent_source, /obj/item/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/reagent_containers/pill))
+ if(istype(reagent_source, /obj/item/reagent_containers/food/snacks))
+ var/obj/item/reagent_containers/food/snacks/R = reagent_source
+ if (R.trash)
+ R.generate_trash(get_turf(user))
visi_msg="[user] composts [reagent_source], spreading it through [target]"
transfer_amount = reagent_source.reagents.total_volume
else
@@ -721,34 +508,32 @@
syr.mode = 0
else if(istype(reagent_source, /obj/item/reagent_containers/spray/))
visi_msg="[user] sprays [target] with [reagent_source]"
- playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
- irrigate = 1
+ //playsound(loc, 'sound/effect/spray3.ogg', 50, 1, 6) //this sound displeases my ears immensely
else if(transfer_amount) // Droppers, cans, beakers, what have you.
visi_msg="[user] uses [reagent_source] on [target]"
irrigate = 1
- // Beakers, bottles, buckets, etc.
- if(reagent_source.is_drainable())
- playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
+
if(irrigate && transfer_amount > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation)
trays = FindConnected()
if (trays.len > 1)
- visi_msg += ", setting off the irrigation system"
+ visi_msg += ", setting off the irrigation system."
+ playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE)
if(visi_msg)
- visible_message("[visi_msg].")
+ visible_message("[visi_msg]")
var/split = round(transfer_amount/trays.len)
+
for(var/obj/machinery/hydroponics/H in trays)
//cause I don't want to feel like im juggling 15 tamagotchis and I can get to my real work of ripping flooring apart in hopes of validating my life choices of becoming a space-gardener
-
var/datum/reagents/S = new /datum/reagents() //This is a strange way, but I don't know of a better one so I can't fix it at the moment...
S.my_atom = H
-
reagent_source.reagents.trans_to(S,split)
if(istype(reagent_source, /obj/item/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/reagent_containers/pill))
qdel(reagent_source)
+ lastuser = user
H.applyChemicals(S, user)
@@ -757,7 +542,6 @@
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) && !istype(O, /obj/item/seeds/sample))
if(!myseed)
@@ -766,22 +550,40 @@
if(!user.transferItemToLoc(O, src))
return
to_chat(user, "You plant [O].")
- dead = 0
+ dead = FALSE
myseed = O
+ name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name)
age = 1
plant_health = myseed.endurance
lastcycle = world.time
+ for(var/datum/plant_gene/trait/G in myseed.genes)
+ G.apply_vars(myseed)
update_icon()
+ return
else
to_chat(user, "[src] already has seeds in it!")
+ return
else if(istype(O, /obj/item/plant_analyzer))
+ var/obj/item/plant_analyzer/P_analyzer = O
if(myseed)
- to_chat(user, "*** [myseed.plantname] ***" )
- to_chat(user, "- Plant Age: [age]")
- var/list/text_string = myseed.get_analyzer_text()
- if(text_string)
- to_chat(user, text_string)
+ if(!P_analyzer.scan_mode)
+ to_chat(user, "*** [myseed.plantname] ***" )
+ to_chat(user, "- Plant Age: [age]")
+ var/list/text_string = myseed.get_analyzer_text()
+ if(text_string)
+ to_chat(user, text_string)
+ to_chat(user, "*---------*")
+ else
+ to_chat(user, "- Plant Reagents -")
+ to_chat(user, "*---------*")
+ if(!LAZYLEN(myseed.reagents_add))
+ to_chat(user, "- No reagents -")
+ to_chat(user, "*---------*")
+ return
+ for(var/datum/plant_gene/reagent/G in myseed.genes)
+ to_chat(user, "- [G.get_name()] -")
+ to_chat(user, "*---------*")
else
to_chat(user, "No plant found.")
to_chat(user, "- Weed level: [weedlevel] / 10")
@@ -790,6 +592,7 @@
to_chat(user, "- Water level: [waterlevel] / [maxwater]")
to_chat(user, "- Nutrition level: [nutrilevel] / [maxnutri]")
to_chat(user, "")
+ return
else if(istype(O, /obj/item/cultivator))
if(weedlevel > 0)
@@ -833,6 +636,8 @@
harvest = FALSE //To make sure they can't just put in another seed and insta-harvest it
qdel(myseed)
myseed = null
+ name = initial(name)
+ desc = initial(desc)
weedlevel = 0 //Has a side effect of cleaning up those nasty weeds
update_icon()
@@ -857,20 +662,22 @@
if(issilicon(user)) //How does AI know what plant is?
return
if(harvest)
- return myseed.harvest(user)
+ myseed.harvest(user)
+ return
else if(dead)
- dead = 0
+ dead = FALSE
to_chat(user, "You remove the dead plant from [src].")
qdel(myseed)
myseed = null
update_icon()
+ name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name)
else
if(user)
examine(user)
/obj/machinery/hydroponics/proc/update_tray(mob/user)
- harvest = 0
+ harvest = FALSE
lastproduce = age
if(istype(myseed, /obj/item/seeds/replicapod))
to_chat(user, "You harvest from the [myseed.plantname].")
@@ -881,31 +688,33 @@
if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest))
qdel(myseed)
myseed = null
- dead = 0
+ dead = FALSE
+ name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name)
+ desc = initial(desc)
update_icon()
/// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds.///
/obj/machinery/hydroponics/proc/adjustNutri(adjustamt)
- nutrilevel = CLAMP(nutrilevel + adjustamt, 0, maxnutri)
+ nutrilevel = clamp(nutrilevel + adjustamt, 0, maxnutri)
/obj/machinery/hydroponics/proc/adjustWater(adjustamt)
- waterlevel = CLAMP(waterlevel + adjustamt, 0, maxwater)
+ waterlevel = clamp(waterlevel + adjustamt, 0, maxwater)
if(adjustamt>0)
adjustToxic(-round(adjustamt/4))//Toxicity dilutation code. The more water you put in, the lesser the toxin concentration.
/obj/machinery/hydroponics/proc/adjustHealth(adjustamt)
if(myseed && !dead)
- plant_health = CLAMP(plant_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)
+ toxic = clamp(toxic + adjustamt, 0, 100)
/obj/machinery/hydroponics/proc/adjustPests(adjustamt)
- pestlevel = CLAMP(pestlevel + adjustamt, 0, 10)
+ pestlevel = clamp(pestlevel + adjustamt, 0, 10)
/obj/machinery/hydroponics/proc/adjustWeeds(adjustamt)
- weedlevel = CLAMP(weedlevel + adjustamt, 0, 10)
+ weedlevel = clamp(weedlevel + adjustamt, 0, 10)
/obj/machinery/hydroponics/proc/spawnplant() // why would you put strange reagent in a hydro tray you monster I bet you also feed them blood
var/list/livingplants = list(/mob/living/simple_animal/hostile/tree, /mob/living/simple_animal/hostile/killertomato)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index b8e561ce..d81185e4 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -356,6 +356,164 @@ datum/plant_gene/trait/glow/white
name = "Pink Bioluminescence"
glow_color = "#FFB3DA"
+//Change grow, harvest, and crafted food's color
+//Made for mostly being fancy with stuff. Should be rare or hard to obtain, with the exception of strange seeds
+/datum/plant_gene/trait/modified_color
+ name = "Dilated Light (Negative)"
+ var/color = list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0) //Negative Colors
+ var/long_calculation = FALSE //For advanced color matrices
+
+/datum/plant_gene/trait/modified_color/on_new(obj/item/reagent_containers/food/snacks/grown/G, newloc)
+ if(G.modified_colors)
+ return
+ for(var/datum/plant_gene/trait/I in G.seed.genes) //Have ones first added give priority
+ if(istype(I, /datum/plant_gene/trait/modified_color) && I.type != type)
+ return
+ if(long_calculation)
+ calculate()
+ G.color = color
+ G.modified_colors = TRUE
+
+//same as above but for the gene modder
+/datum/plant_gene/trait/modified_color/apply_vars(obj/item/seeds/S)
+ S.color = color
+ S.modified_colors = TRUE
+
+/datum/plant_gene/trait/modified_color/proc/calculate()
+ return
+
+/datum/plant_gene/trait/modified_color/transparent
+ name = "Dilated Light (Flimsy)"
+ color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, -0.3,-0.3,-0.3,0.7, 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/monochrome
+ name = "Dilated Light (Monochrome)"
+ color = list(0.5,0.5,0.5,0, 0.5,0.5,0.5,0, 0.5,0.5,0.5,0, 0,0,0,1, 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/monochrome/red
+ name = "Dilated Light (Red)"
+ color = list(0.8,0,0,0, 0.8,0.5,0.5,0, 0.8,0.5,0.5,0, 0,0,0,1, 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/monochrome/green
+ name = "Dilated Light (Green)"
+ color = list(0.5,0.8,0.5,0, 0,0.8,0,0, 0.5,0.8,0.5,0, 0,0,0,1, 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/monochrome/blue
+ name = "Dilated Light (Blue)"
+ color = list(0.5,0.5,0.8,0, 0.5,0.5,0.8,0, 0,0,0.8,0, 0,0,0,1, 0,0,0,0)
+
+/*
+/datum/plant_gene/trait/modified_color/monochrome/yellow
+ name = "Dilated Light (Yellow)"
+ color = list(0.8,0,0,0, 0,0.4,0,0, 0.8,0.4,0.5,0, 0,0,0,1, 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/monochrome/green
+ name = "Dilated Light (Green)"
+ color = list(0.5,0.8,0.4,0, 0,0.8,0,0, 0,0,0.4,0, 0,0,0,1, 0,0,0,0)
+*/
+
+/datum/plant_gene/trait/modified_color/monochrome/dark/
+ name = "Dilated Light (Dark)"
+ color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, -0.3, -0.3, -0.3, 0)
+
+/*
+/datum/plant_gene/trait/modified_color/monochrome/dark/red //for vyx
+ name = "Dilated Light (Dark Red)"
+ color = list(1,0,0,0, 0.5,0.5,0.5,0, 0.5,0.5,0.5,0, 0,0,0,1, 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/monochrome/dark/green
+ name = "Dilated Light (Dark Green)"
+ color = list(0.5,0.5,0.5,0, 0,1,0,0, 0.5,0.5,0.5,0, 0,0,0,1, 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/monochrome/dark/blue
+ name = "Dilated Light (Dark Blue)"
+ color = list(0.5,0.5,0.,0, 0.5,0.5,0.5,0, 0,0,1,0, 0,0,0,1, 0,0,0,0)
+*/
+
+/datum/plant_gene/trait/modified_color/vibrant
+ name = "Dilated Light (Strong)"
+ color = list(2,-1,-1,0, -1,2,-1,0, -1,-1,2,0, 0,0,0,1, 0,0,0,0) //Any higher starts to look like clown vomit
+
+/datum/plant_gene/trait/modified_color/cyan
+ name = "Dilated Light (Shift R)"
+ color = list(
+ 0.25, 1, 0.5, 0,
+ 0.5, 0.25, 1, 0,
+ 1, 0.5, 0.25, 0,
+ 0,0,0,1,
+ 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/magenta
+ name = "Dilated Light (Shift L)"
+ color = list(
+ 0.25, 0.5, 1, 0,
+ 1, 0.25, 0.5, 0,
+ 0.5, 1, 0.25, 0,
+ 0,0,0,1,
+ 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/sunset
+ name = "Dilated Light (Shift S)"
+ color = list(
+ 1, 0.25, 0, 0,
+ 0.25, 1, 0, 0,
+ 0.25, 0.125, 0.35,0,
+ 0,0,0,1,
+ 0,0,0,0)
+
+/datum/plant_gene/trait/modified_color/random
+ name = "Dilated Light (Shift C)"
+ color = list()
+ long_calculation = TRUE
+
+
+//Calculations
+/*
+/datum/plant_gene/trait/modified_color/shift_red/calculate()
+ var/list/M = color
+ M[5] += 0.5 * M[1]
+ M[6] += 0.5 * M[2]
+ M[7] += 0.5 * M[3]
+ color = M
+
+/datum/plant_gene/trait/modified_color/shift_green/calculate()
+ var/list/M = color
+ M[9] += 0.5 * M[5]
+ M[10] += 0.5 * M[6]
+ M[11] += 0.5 * M[7]
+ color = M
+
+/datum/plant_gene/trait/modified_color/shift_blue/calculate()
+ var/list/M = color
+ M[13] += 0.5 * M[9]
+ M[14] += 0.5 * M[10]
+ M[15] += 0.5 * M[11]
+ color = M
+*/
+
+/datum/plant_gene/trait/modified_color/random/calculate()
+ var/R = rand(0,255) / 255
+ var/G = rand(0,255) / 255
+ var/B = rand(0,255) / 255
+ var/A = rand(200,255)/ 255
+
+ if(prob(50))
+ color = list(R,0,0,0,
+ 0,G,0,0,
+ 0,0,B,0,
+ 0,0,0,1,
+ 0,0,0,0)
+ else
+ color = list(R,0,0,0,
+ 0,G,0,0,
+ 0,0,B,0,
+ 0,0,0,A,
+ 0,0,0,0)
+ var/D = rand(1,20)
+ if(color[D] != 0)
+ color[D] *= 1.5
+ else
+ color[D] = rand(-100, 100) * 0.01
/datum/plant_gene/trait/teleport
// Makes plant teleport people when squashed or slipped on.
diff --git a/code/modules/hydroponics/sample.dm b/code/modules/hydroponics/sample.dm
index fff4c646..7fb92e8f 100644
--- a/code/modules/hydroponics/sample.dm
+++ b/code/modules/hydroponics/sample.dm
@@ -18,4 +18,4 @@
/obj/item/seeds/sample/alienweed
name = "alien weed sample"
icon_state = "alienweed"
- sample_color = null
\ No newline at end of file
+ sample_color = null
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index 63b96632..6073fcdf 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -52,9 +52,9 @@
/obj/machinery/seed_extractor/RefreshParts()
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
- max_seeds = 1000 * B.rating
+ max_seeds = initial(max_seeds) * B.rating
for(var/obj/item/stock_parts/manipulator/M in component_parts)
- seed_multiplier = M.rating
+ seed_multiplier = initial(seed_multiplier) * M.rating
/obj/machinery/seed_extractor/examine(mob/user)
. = ..()
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 2c1f6a8f..b7a188aa 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -8,7 +8,8 @@
w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
var/plantname = "Plants" // Name of plant when planted.
- var/product // A type path. The thing that is created when the plant is harvested.
+ var/obj/item/product // A type path. The thing that is created when the plant is harvested.
+ var/productdesc
var/species = "" // Used to update icons. Should match the name in the sprites unless all icon_* are overridden.
var/growing_icon = 'icons/obj/hydroponics/growing.dmi' //the file that stores the sprites of the growing plant from this seed.
@@ -26,7 +27,7 @@
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.
- var/list/forbiddengenes = list() // Plant genes that the seed may be forbidden from having.
+ var/list/forbiddengenes = list() // Genes the seed cannot have, such as perennial growth
var/list/reagents_add = list()
// A list of reagents to add to product.
// Format: "reagent_id" = potency multiplier
@@ -35,6 +36,7 @@
var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth
var/weed_chance = 5 //Percentage chance per tray update to grow weeds
+ var/modified_colors = FALSE
/obj/item/seeds/Initialize(mapload, nogenes = 0)
. = ..()
@@ -70,6 +72,16 @@
genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id])
reagents_from_genes() //quality coding
+/obj/item/seeds/examine(mob/user)
+ . = ..()
+ if(modified_colors)
+ . += "It looks a bit funky..."
+ . += "Use a pen on it to rename it or change its description."
+ if(reagents_add && user.can_see_reagents())
+ . += "- Plant Reagents -"
+ for(var/datum/plant_gene/reagent/G in genes)
+ . += "- [G.get_name()] -"
+
/obj/item/seeds/proc/Copy()
var/obj/item/seeds/S = new type(null, 1)
// Copy all the stats
@@ -81,18 +93,26 @@
S.potency = potency
S.weed_rate = weed_rate
S.weed_chance = weed_chance
+ S.name = name
+ S.plantname = plantname
+ S.desc = desc
+ S.productdesc = productdesc
S.genes = list()
for(var/g in genes)
var/datum/plant_gene/G = g
S.genes += G.Copy()
S.reagents_add = reagents_add.Copy() // Faster than grabbing the list from genes.
+ if(modified_colors)
+ S.modified_colors = TRUE
+ S.color = color
return S
/obj/item/seeds/proc/get_gene(typepath)
return (locate(typepath) in genes)
-obj/item/seeds/proc/is_gene_forbidden(typepath)
- return (locate(typepath) in forbiddengenes)
+
+/obj/item/seeds/proc/is_gene_forbidden(typepath)
+ return (typepath in forbiddengenes)
/obj/item/seeds/proc/reagents_from_genes()
@@ -121,9 +141,10 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
adjust_weed_rate(rand(-wrmut, wrmut))
adjust_weed_chance(rand(-wcmut, wcmut))
if(prob(traitmut))
- add_random_traits(1, 1)
-
-
+ if(prob(50))
+ add_random_traits(1, 1)
+ else
+ add_random_reagents(1, 1)
/obj/item/seeds/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
if(istype(Proj, /obj/item/projectile/energy/florayield))
@@ -136,6 +157,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
adjust_yield(1 * rating)
else if(prob(1/(yield * yield) * 100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
adjust_yield(1 * rating)
+ return BULLET_ACT_HIT
else
return ..()
@@ -156,24 +178,37 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
/obj/item/seeds/proc/harvest(mob/user)
var/obj/machinery/hydroponics/parent = loc //for ease of access
- var/t_amount = 0
- var/list/result = list()
- var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //needed for TK
+ var/t_amount = 0 ///Count used for creating the correct amount of results to the harvest.
+ var/list/result = list() ///List of plants all harvested from the same batch.
+ var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //Tile of the harvester to deposit the growables, needed for TK
var/product_name
- while(t_amount < getYield())
- var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src)
+ var/product_count = getYield()
+
+ while(t_amount < product_count)
+ var/obj/item/reagent_containers/food/snacks/grown/t_prod
+ t_prod = new product(output_loc, src)
+ if(parent.myseed.plantname != initial(parent.myseed.plantname))
+ t_prod.name = lowertext(parent.myseed.plantname)
+ if(productdesc)
+ t_prod.desc = productdesc
+ t_prod.seed.name = parent.myseed.name
+ t_prod.seed.desc = parent.myseed.desc
+ t_prod.seed.plantname = parent.myseed.plantname
result.Add(t_prod) // User gets a consumable
if(!t_prod)
return
+
+ if(modified_colors)
+ t_prod.color = color
+ t_prod.modified_colors = TRUE
t_amount++
- product_name = t_prod.name
+ product_name = parent.myseed.plantname
if(getYield() >= 1)
- SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name)
+ SSblackbox.record_feedback("tally", "food_harvested", product_count, product_name)
parent.update_tray(user)
return result
-
/obj/item/seeds/proc/prepare_result(var/obj/item/reagent_containers/food/snacks/grown/T)
if(!T.reagents)
CRASH("[T] has no reagents.")
@@ -194,7 +229,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
/// Setters procs ///
/obj/item/seeds/proc/adjust_yield(adjustamt)
if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable
- yield = CLAMP(yield + adjustamt, 0, 10)
+ yield = clamp(yield + 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.
@@ -203,39 +238,39 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
C.value = yield
/obj/item/seeds/proc/adjust_lifespan(adjustamt)
- lifespan = CLAMP(lifespan + adjustamt, 10, 100)
+ lifespan = clamp(lifespan + 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/adjust_endurance(adjustamt)
- endurance = CLAMP(endurance + adjustamt, 10, 100)
+ endurance = clamp(endurance + 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/adjust_production(adjustamt)
if(yield != -1)
- production = CLAMP(production + adjustamt, 1, 10)
+ production = clamp(production + adjustamt, 1, 10)
var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production)
if(C)
C.value = production
/obj/item/seeds/proc/adjust_potency(adjustamt)
if(potency != -1)
- potency = CLAMP(potency + adjustamt, 0, 100)
+ potency = clamp(potency + 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/adjust_weed_rate(adjustamt)
- weed_rate = CLAMP(weed_rate + adjustamt, 0, 10)
+ weed_rate = clamp(weed_rate + adjustamt, 0, 10)
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, 67)
+ weed_chance = clamp(weed_chance + adjustamt, 0, 67)
var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance)
if(C)
C.value = weed_chance
@@ -244,7 +279,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
/obj/item/seeds/proc/set_yield(adjustamt)
if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable
- yield = CLAMP(adjustamt, 0, 10)
+ 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.
@@ -253,39 +288,39 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
C.value = yield
/obj/item/seeds/proc/set_lifespan(adjustamt)
- lifespan = CLAMP(adjustamt, 10, 100)
+ 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)
+ 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, 1, 10)
+ production = clamp(adjustamt, 1, 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)
+ 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, 10)
+ weed_rate = clamp(adjustamt, 0, 10)
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, 67)
+ weed_chance = clamp(adjustamt, 0, 67)
var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance)
if(C)
C.value = weed_chance
@@ -320,9 +355,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
continue
all_traits += " [traits.get_name()]"
text += "- Plant Traits:[all_traits]\n"
-
text += "*---------*"
-
return text
/obj/item/seeds/proc/on_chem_reaction(datum/reagents/S) //in case seeds have some special interaction with special chems
@@ -331,19 +364,73 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
/obj/item/seeds/attackby(obj/item/O, mob/user, params)
if (istype(O, /obj/item/plant_analyzer))
to_chat(user, "*---------*\n This is \a [src].")
- var/text = get_analyzer_text()
- if(text)
- to_chat(user, "[text]")
-
+ var/text
+ var/obj/item/plant_analyzer/P_analyzer = O
+ if(!P_analyzer.scan_mode)
+ text = get_analyzer_text()
+ if(text)
+ to_chat(user, "[text]")
+ else
+ to_chat(user, "- Plant Reagents -")
+ to_chat(user, "*---------*")
+ if(!LAZYLEN(reagents_add))
+ to_chat(user, "- No reagents -")
+ to_chat(user, "*---------*")
+ return
+ for(var/datum/plant_gene/reagent/G in genes)
+ to_chat(user, "- [G.get_name()] -")
+ to_chat(user, "*---------*")
return
+
+ if(istype(O, /obj/item/pen))
+ var/choice = input("What would you like to change?") in list("Plant Name", "Seed Description", "Product Description", "Cancel")
+ if(!user.canUseTopic(src, BE_CLOSE))
+ return
+ switch(choice)
+ if("Plant Name")
+ var/newplantname = reject_bad_text(stripped_input(user, "Write a new plant name:", name, plantname))
+ if(!user.canUseTopic(src, BE_CLOSE))
+ return
+ if (length(newplantname) > 20)
+ to_chat(user, "That name is too long!")
+ return
+ if(!newplantname)
+ to_chat(user, "That name is invalid.")
+ return
+ else
+ name = "[lowertext(newplantname)]"
+ plantname = newplantname
+ if("Seed Description")
+ var/newdesc = stripped_input(user, "Write a new description:", name, desc)
+ if(!user.canUseTopic(src, BE_CLOSE))
+ return
+ if (length(newdesc) > 180)
+ to_chat(user, "That description is too long!")
+ return
+ if(!newdesc)
+ to_chat(user, "That description is invalid.")
+ return
+ else
+ desc = newdesc
+ if("Product Description")
+ if(product && !productdesc)
+ productdesc = initial(product.desc)
+ var/newproductdesc = stripped_input(user, "Write a new description:", name, productdesc)
+ if(!user.canUseTopic(src, BE_CLOSE))
+ return
+ if (length(newproductdesc) > 180)
+ to_chat(user, "That description is too long!")
+ return
+ if(!newproductdesc)
+ to_chat(user, "That description is invalid.")
+ return
+ else
+ productdesc = newproductdesc
+ else
+ return
+
..() // Fallthrough to item/attackby() so that bags can pick seeds up
-
-
-
-
-
-
// Checks plants for broken tray icons. Use Advanced Proc Call to activate.
// Maybe some day it would be used as unit test.
/proc/check_plants_growth_stages_icons()
@@ -393,10 +480,16 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
/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/random_trait
+ if(!istype(src, /obj/item/seeds/random) || prob(30)) //70% chance to not get modified_color when rolling traits as strange seeds
+ random_trait = pick((subtypesof(/datum/plant_gene/trait)-typesof(/datum/plant_gene/trait/plant_type)))
+ else
+ random_trait = pick((subtypesof(/datum/plant_gene/trait)-typesof(/datum/plant_gene/trait/plant_type)-typesof(/datum/plant_gene/trait/modified_color)))
+
var/datum/plant_gene/trait/T = new random_trait
- if(T.can_add(src) && !is_gene_forbidden(T))
+ if(T.can_add(src) && !is_gene_forbidden(random_trait))
genes += T
+ T.apply_vars(src)
else
qdel(T)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 0fa512b7..6d811bdc 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -18,7 +18,7 @@
var/datum/action/innate/regenerate_limbs/regenerate_limbs
var/datum/action/innate/slime_change/slime_change //CIT CHANGE
liked_food = TOXIC | MEAT
- toxic_food = null
+ toxic_food = ANTITOXIC
coldmod = 6 // = 3x cold damage
heatmod = 0.5 // = 1/4x heat damage
burnmod = 0.5 // = 1/2x generic burn damage
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 5a4b0e5c..7eb1d72b 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -21,6 +21,7 @@
resistance_flags = FLAMMABLE
max_integrity = 50
dog_fashion = /datum/dog_fashion/head
+ grind_results = list(/datum/reagent/cellulose = 2)
var/info //What's actually written on the paper.
var/info_links //A different version of the paper which includes html links at fields and EOF
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 0789df9f..b45e56d8 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -942,7 +942,41 @@
glass_icon_state = "glass_yellow"
glass_name = "glass of bungo juice"
glass_desc = "Exotic! You feel like you are on vacation already."
- hydration = 1 * REAGENTS_METABOLISM
+ hydration = 1 * REAGENTS_METABOLISM
+
+/datum/reagent/consumable/aloejuice
+ name = "Aloe Juice"
+ color = "#A3C48B"
+ description = "A healthy and refreshing juice."
+ taste_description = "vegetable"
+ glass_icon_state = "glass_yellow"
+ glass_name = "glass of aloe juice"
+ glass_desc = "A healthy and refreshing juice."
+ hydration = 2 * REAGENTS_METABOLISM
+
+/datum/reagent/consumable/aloejuice/on_mob_life(mob/living/M)
+ if(prob(30))
+ M.adjustToxLoss(-1, 0)
+ ..()
+ . = 1
+
+/datum/reagent/consumable/banana_peel
+ name = "Pulped Banana Peel"
+ description = "Okay, so you put a banana peel in a grinder... Why, exactly?"
+ color = "#863333" // rgb: 175, 175, 0
+ reagent_state = SOLID
+ taste_description = "stringy, bitter pulp"
+ glass_name = "glass of banana peel pulp"
+ glass_desc = "Okay, so you put a banana peel in a grinder... Why, exactly?"
+
+/datum/reagent/consumable/baked_banana_peel
+ name = "Baked Banana Peel Powder"
+ description = "You took a banana peel... pulped it... baked it... Where are you going with this?"
+ color = "#863333" // rgb: 175, 175, 0
+ reagent_state = SOLID
+ taste_description = "bitter powder"
+ glass_name = "glass of banana peel powder"
+ description = "You took a banana peel... pulped it... baked it... Where are you going with this?"
/datum/reagent/consumable/wockyslush
name = "Wocky Slush"
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 988c0133..b5384f8a 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -789,7 +789,7 @@
/datum/reagent/consumable/secretsauce
name = "secret sauce"
- description = "What could it be."
+ description = "What could it be?"
nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#792300"
taste_description = "indescribable"
@@ -817,5 +817,13 @@
description = "Sweet, Smokey, Savory, and gets everywhere. Perfect for Grilling."
nutriment_factor = 5 * REAGENTS_METABOLISM
color = "#78280A" // rgb: 120 40, 10
- taste_mult = 2.5 //sugar's 1.5, capsacin's 1.5, so a good middle ground.
+ taste_mult = 2.25 //sugar's 1.5, capsacin's 1.5, so a good middle ground.
taste_description = "smokey sweetness"
+
+/datum/reagent/consumable/laughsyrup
+ name = "Laughin' Syrup"
+ description = "The product of juicing Laughin' Peas. Fizzy, and seems to change flavour based on what it's used with!"
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#803280"
+ taste_mult = 2
+ taste_description = "fizzy sweetness"
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 6cf4be4a..3c82ea56 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1464,3 +1464,58 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5)
..()
. = 1
+
+/datum/reagent/medicine/coagulant
+ name = "Sanguirite"
+ description = "A proprietary coagulant used to help bleeding wounds clot faster."
+ reagent_state = LIQUID
+ color = "#bb2424"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 20
+ /// How much base clotting we do per bleeding wound, multiplied by the below number for each bleeding wound
+ var/clot_rate = 0.25
+ /// If we have multiple bleeding wounds, we count the number of bleeding wounds, then multiply the clot rate by this^(n) before applying it to each cut, so more cuts = less clotting per cut (though still more total clotting)
+ var/clot_coeff_per_wound = 0.9
+
+/* //Residue from porting citadel's botany things. We don't have wounds yet (i think); uncomment this when it becomes a thing
+/datum/reagent/medicine/coagulant/on_mob_life(mob/living/carbon/M)
+ . = ..()
+ if(!M.blood_volume || !M.all_wounds)
+ return
+
+ var/effective_clot_rate = clot_rate
+
+ for(var/i in M.all_wounds)
+ var/datum/wound/iter_wound = i
+ if(iter_wound.blood_flow)
+ effective_clot_rate *= clot_coeff_per_wound
+
+ for(var/i in M.all_wounds)
+ var/datum/wound/iter_wound = i
+ iter_wound.blood_flow = max(0, iter_wound.blood_flow - effective_clot_rate)
+*/
+
+/datum/reagent/medicine/coagulant/overdose_process(mob/living/M)
+ . = ..()
+ if(!M.blood_volume)
+ return
+
+ if(prob(15))
+ M.losebreath += rand(2,4)
+ M.adjustOxyLoss(rand(1,3))
+ if(prob(30))
+ to_chat(M, "You can feel your blood clotting up in your veins!")
+ else if(prob(10))
+ to_chat(M, "You feel like your blood has stopped moving!")
+ if(prob(50))
+ var/obj/item/organ/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS)
+ our_lungs.applyOrganDamage(1)
+ else
+ var/obj/item/organ/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART)
+ our_heart.applyOrganDamage(1)
+
+// can be synthesized on station rather than bought. made by grinding a banana peel, heating it up, then mixing the banana peel powder with salglu
+/datum/reagent/medicine/coagulant/weak
+ name = "Synthi-Sanguirite"
+ description = "A synthetic coagulant used to help bleeding wounds clot faster. Not quite as effective as name brand Sanguirite, especially on patients with lots of cuts."
+ clot_coeff_per_wound = 0.8
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index fec41de8..4e8671b3 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -172,6 +172,14 @@
color = BLOOD_COLOR_BUG // Bug colored, I guess.
pH = 7.25
+/datum/reagent/blood/tomato
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Tomato Blood"
+ description = "This highly resembles blood, but it doesnt actually function like it, resembling more ketchup, with a more blood-like consistency."
+ taste_description = "sap" //Like tree sap?
+ pH = 7.45
+ value = 0
+
/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M)
if(prob(10))
@@ -1612,16 +1620,21 @@
tox_prob = 15
pH = 1
+/datum/reagent/plantnutriment/endurogrow
+ name = "Enduro Grow"
+ description = "A specialized nutriment, which decreases product quantity and potency, but strengthens the plants endurance."
+ color = "#a06fa7" // RBG: 160, 111, 167
+ tox_prob = 15
-
-
-
+/datum/reagent/plantnutriment/liquidearthquake
+ name = "Liquid Earthquake"
+ description = "A specialized nutriment, which increases the plant's production speed, as well as its susceptibility to weeds."
+ color = "#912e00" // RBG: 145, 46, 0
+ tox_prob = 25
// GOON OTHERS
-
-
/datum/reagent/oil
name = "Oil"
description = "Burns in a small smoky fire, mostly used to get Ash."
@@ -2234,6 +2247,13 @@
M.adjustArousalLoss(3)
..()
+/datum/reagent/cellulose
+ name = "Cellulose Fibers"
+ description = "A crystaline polydextrose polymer, plants swear by this stuff."
+ reagent_state = SOLID
+ color = "#E6E6DA"
+ taste_mult = 0
+
// Adding new mutation toxin stuff from /code/modules/reagent/chemistry/recipes/slime_extracts.dm
//Some other stuff like moth and felinid ( /datum/reagent/mutationtoxin/moth and /datum/reagent/mutationtoxin/felinid ) already exists. - Chemlight
/datum/reagent/mutationtoxin/mammal
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 6d6deb71..2fdd7d29 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -50,6 +50,20 @@
results = list(/datum/reagent/medicine/salglu_solution = 3)
required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1)
+/datum/chemical_reaction/baked_banana_peel
+ name = "Baked Banana Peel"
+ results = list(/datum/reagent/consumable/baked_banana_peel = 1)
+ required_temp = 413.15
+ required_reagents = list(/datum/reagent/consumable/banana_peel = 1)
+ mix_message = "The pulp dries up and takes on a powdery state!"
+ mob_react = FALSE
+
+/datum/chemical_reaction/coagulant_weak
+ name = "Weak Coagulant"
+ results = list(/datum/reagent/medicine/coagulant/weak = 3)
+ required_reagents = list(/datum/reagent/medicine/salglu_solution = 2, /datum/reagent/consumable/baked_banana_peel = 1)
+ mob_react = FALSE
+
/datum/chemical_reaction/mine_salve
name = "Miner's Salve"
id = /datum/reagent/medicine/mine_salve
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index b06eff62..9c67fc5e 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -69,6 +69,11 @@
for(var/i = 1, i <= created_volume, i++)
new /obj/item/stack/sheet/mineral/gold(location)
+/datum/chemical_reaction/cellulose_carbonization
+ results = list(/datum/reagent/carbon = 1)
+ required_reagents = list(/datum/reagent/cellulose = 1)
+ required_temp = 512
+
/datum/chemical_reaction/capsaicincondensation
name = "Capsaicincondensation"
id = /datum/reagent/consumable/condensedcapsaicin
@@ -235,7 +240,7 @@
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
if(D)
D.Evolve(level_min, level_max)
-
+
/datum/chemical_reaction/mix_virus/mix_virus_2
name = "Mix Virus 2"
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index a0070273..e4269405 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -310,5 +310,5 @@
item_state = "plantbgone"
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
- volume = 100
- list_reagents = list(/datum/reagent/toxin/plantbgone = 100)
+ volume = 50
+ list_reagents = list(/datum/reagent/toxin/plantbgone = 50)
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
index 20242c91..c893573f 100644
--- a/code/modules/research/designs/biogenerator_designs.dm
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -2,8 +2,11 @@
///////Biogenerator Designs ///////
///////////////////////////////////
+//Please be wary to not add inorganic items to the results such as generic glass bottles and metal.
+//as they kind of defeat the design of this feature.
+
/datum/design/milk
- name = "10 Milk"
+ name = "10u Milk"
id = "milk"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 20)
@@ -11,29 +14,13 @@
category = list("initial","Food")
/datum/design/cream
- name = "10 Cream"
+ name = "10u Cream"
id = "cream"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 30)
make_reagents = list(/datum/reagent/consumable/cream = 10)
category = list("initial","Food")
-/datum/design/milk_carton
- name = "Milk Carton"
- id = "milk_carton"
- build_type = BIOGENERATOR
- materials = list(MAT_BIOMASS = 100)
- build_path = /obj/item/reagent_containers/food/condiment/milk
- category = list("initial","Food")
-
-/datum/design/cream_carton
- name = "Cream Carton"
- id = "cream_carton"
- build_type = BIOGENERATOR
- materials = list(MAT_BIOMASS = 300)
- build_path = /obj/item/reagent_containers/food/drinks/bottle/cream
- category = list("initial","Food")
-
/datum/design/black_pepper
name = "10u Black Pepper"
id = "black_pepper"
@@ -42,13 +29,12 @@
make_reagents = list(/datum/reagent/consumable/blackpepper = 10)
category = list("initial","Food")
-/datum/design/pepper_mill
- name = "Pepper Mill"
- id = "pepper_mill"
+/datum/design/enzyme
+ name = "10u Universal Enzyme"
+ id = "enzyme"
build_type = BIOGENERATOR
- materials = list(MAT_BIOMASS = 50)
- build_path = /obj/item/reagent_containers/food/condiment/peppermill
- make_reagents = list()
+ materials = list(MAT_BIOMASS = 30)
+ make_reagents = list(/datum/reagent/consumable/enzyme = 10)
category = list("initial","Food")
/datum/design/monkey_cube
@@ -68,52 +54,92 @@
category = list("initial", "Food")
/datum/design/ez_nut
- name = "E-Z Nutrient"
+ name = "10u E-Z Nutrient"
id = "ez_nut"
build_type = BIOGENERATOR
- materials = list(MAT_BIOMASS = 10)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/ez
+ materials = list(MAT_BIOMASS = 2)
+ make_reagents = list(/datum/reagent/plantnutriment/eznutriment = 10)
category = list("initial","Botany Chemicals")
/datum/design/l4z_nut
- name = "Left 4 Zed"
+ name = "10u Left 4 Zed"
id = "l4z_nut"
build_type = BIOGENERATOR
- materials = list(MAT_BIOMASS = 20)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/l4z
+ materials = list(MAT_BIOMASS = 4)
+ make_reagents = list(/datum/reagent/plantnutriment/left4zednutriment = 10)
category = list("initial","Botany Chemicals")
/datum/design/rh_nut
- name = "Robust Harvest"
+ name = "10u Robust Harvest"
id = "rh_nut"
build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 5)
+ make_reagents = list(/datum/reagent/plantnutriment/robustharvestnutriment = 10)
+ category = list("initial","Botany Chemicals")
+
+/datum/design/ammonia
+ name = "10u Ammonia"
+ id = "ammonia_biogen"
+ build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 25)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/rh
+ make_reagents = list(/datum/reagent/ammonia = 10)
+ category = list("initial","Botany Chemicals")
+
+/datum/design/saltpetre
+ name = "10u Saltpetre"
+ id = "saltpetre_biogen"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 75)
+ make_reagents = list(/datum/reagent/saltpetre = 10)
+ category = list("initial","Botany Chemicals")
+
+/datum/design/end_gro
+ name = "30u Enduro Grow"
+ id = "end_gro"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 30)
+ make_reagents = list(/datum/reagent/plantnutriment/endurogrow = 30)
+ category = list("initial","Botany Chemicals")
+
+/datum/design/liq_earth
+ name = "30u Liquid Earthquake"
+ id = "liq_earth"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 30)
+ make_reagents = list(/datum/reagent/plantnutriment/liquidearthquake = 30)
+ category = list("initial","Botany Chemicals")
+
+/datum/design/mutagen //This is here because I'd like it if botany wouldn't completely rely on chemical dispensers to make fancy things
+ name = "10u Unstable Mutagen"
+ id = "fabricated_mutagen"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 30)
+ make_reagents = list(/datum/reagent/toxin/mutagen = 10) //suffer
category = list("initial","Botany Chemicals")
/datum/design/weed_killer
- name = "Weed Killer"
+ name = "10u Weed Killer"
id = "weed_killer"
build_type = BIOGENERATOR
- materials = list(MAT_BIOMASS = 50)
- build_path = /obj/item/reagent_containers/glass/bottle/killer/weedkiller
+ materials = list(MAT_BIOMASS = 10)
+ make_reagents = list(/datum/reagent/toxin/plantbgone/weedkiller = 10)
category = list("initial","Botany Chemicals")
/datum/design/pest_spray
- name = "Pest Killer"
+ name = "10u Pest Killer"
id = "pest_spray"
build_type = BIOGENERATOR
- materials = list(MAT_BIOMASS = 50)
- build_path = /obj/item/reagent_containers/glass/bottle/killer/pestkiller
+ materials = list(MAT_BIOMASS = 10)
+ make_reagents = list(/datum/reagent/toxin/pestkiller = 10)
category = list("initial","Botany Chemicals")
-/datum/design/botany_bottle
- name = "Empty Bottle"
- id = "botany_bottle"
+/datum/design/empty_carton
+ name = "Small Empty Carton Box"
+ id = "empty_carton"
build_type = BIOGENERATOR
- materials = list(MAT_BIOMASS = 5)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/empty
- category = list("initial", "Botany Chemicals")
+ materials = list(MAT_BIOMASS = 15)
+ build_path = /obj/item/reagent_containers/food/drinks/bottle/bio_carton
+ category = list("initial", "Organic Materials")
/datum/design/cloth
name = "Roll of Cloth"
@@ -163,6 +189,14 @@
build_path = /obj/item/storage/belt/janitor
category = list("initial","Organic Materials")
+/datum/design/plantbelt
+ name = "Botanical Belt"
+ id = "plantbelt"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 300)
+ build_path = /obj/item/storage/belt/botany
+ category = list("initial","Organic Materials")
+
/datum/design/s_holster
name = "Shoulder Holster"
id = "s_holster"
diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm
index 0fd49257..c8dc751f 100644
--- a/code/modules/vending/megaseed.dm
+++ b/code/modules/vending/megaseed.dm
@@ -4,14 +4,15 @@
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
icon_state = "seeds"
- products = list(/obj/item/seeds/ambrosia = 3,
- /obj/item/seeds/apple = 3,
- /obj/item/seeds/banana = 3,
- /obj/item/seeds/berry = 3,
+ products = list(/obj/item/seeds/aloe = 3,
+ /obj/item/seeds/ambrosia = 3,
+ /obj/item/seeds/apple = 3,
+ /obj/item/seeds/banana = 3,
+ /obj/item/seeds/berry = 3,
/obj/item/seeds/cabbage = 3,
/obj/item/seeds/carrot = 3,
/obj/item/seeds/cherry = 3,
- /obj/item/seeds/chanter = 3,
+ /obj/item/seeds/chanterelle = 3,
/obj/item/seeds/chili = 3,
/obj/item/seeds/cocoapod = 3,
/obj/item/seeds/coconut = 3,
@@ -19,7 +20,6 @@
/obj/item/seeds/cotton = 3,
/obj/item/seeds/corn = 3,
/obj/item/seeds/eggplant = 3,
- /obj/item/seeds/garlic = 3,
/obj/item/seeds/grape = 3,
/obj/item/seeds/grass = 3,
/obj/item/seeds/lemon = 3,
@@ -28,6 +28,7 @@
/obj/item/seeds/orange = 3,
/obj/item/seeds/peach = 3,
/obj/item/seeds/peanutseed = 3,
+ /obj/item/seeds/peas = 3,
/obj/item/seeds/pineapple = 3,
/obj/item/seeds/potato = 3,
/obj/item/seeds/poppy = 3,
@@ -46,15 +47,21 @@
/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/cannabis = 3,
- /obj/item/seeds/starthistle = 2,
- /obj/item/seeds/random = 2)
+
+ 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/cannabis = 3,
+ /obj/item/seeds/starthistle = 2,
+ /obj/item/seeds/random = 2)
premium = list(/obj/item/reagent_containers/spray/waterflower = 1)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
+ refill_canister = /obj/item/vending_refill/hydroseeds
+
+/obj/item/vending_refill/hydroseeds
+ machine_name = "MegaSeed"
+ icon_state = "refill_hydro"
diff --git a/code/modules/vending/nutrimax.dm b/code/modules/vending/nutrimax.dm
index b82c95b8..32a0caae 100644
--- a/code/modules/vending/nutrimax.dm
+++ b/code/modules/vending/nutrimax.dm
@@ -18,3 +18,8 @@
/obj/item/reagent_containers/glass/bottle/diethylamine = 5)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
+ refill_canister = /obj/item/vending_refill/hydronutrients
+
+/obj/item/vending_refill/hydronutrients
+ machine_name = "NutriMax"
+ icon_state = "refill_hydro"
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 0110b610..166b0415 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi
index beac5672..a694348b 100644
Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi
index da31cc97..b5f71184 100644
Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ
diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi
index 8c67ad8d..96d6d793 100644
Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index 717937c0..1267c8af 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 0a2ed6c8..9c23efc4 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi
index 83506180..a239f1f5 100644
Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 66a35f5f..82acf139 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi
index 01ffbb06..ed5e186f 100644
Binary files a/icons/obj/hydroponics/growing_vegetables.dmi and b/icons/obj/hydroponics/growing_vegetables.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index 5eda34d4..93c96823 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 bcdaabaa..35ecba68 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index 76583326..1f4c9d93 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index d42dbbfd..c969fe39 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/vending_restock.dmi b/icons/obj/vending_restock.dmi
index a59fdd0f..0db875fa 100644
Binary files a/icons/obj/vending_restock.dmi and b/icons/obj/vending_restock.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 08cb371c..042f6cb9 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm b/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm
index 78851321..11bd807d 100644
--- a/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm
+++ b/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm
@@ -1,52 +1,3 @@
-/obj/item/seeds/banana/Initialize()
- . = ..()
- mutatelist += /obj/item/seeds/banana/exotic_banana
-
-
-/obj/item/seeds/banana/exotic_banana
- name = "pack of exotic banana seeds"
- desc = "They're seeds that grow into banana trees. However, those bananas might be alive."
- icon = 'modular_citadel/icons/mob/BananaSpider.dmi'
- icon_state = "seed_ExoticBanana"
- species = "banana"
- plantname = "Exotic Banana Tree"
- product = /obj/item/reagent_containers/food/snacks/grown/banana/banana_spider_spawnable
- growing_icon = 'modular_citadel/icons/mob/BananaSpider.dmi'
- icon_dead = "banana-dead"
- mutatelist = list()
- genes = list(/datum/plant_gene/trait/slip)
- reagents_add = list(/datum/reagent/consumable/banana = 0.1, /datum/reagent/potassium = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.02)
-
-
-/obj/item/reagent_containers/food/snacks/grown/banana/banana_spider_spawnable
- seed = /obj/item/seeds/banana/exotic_banana
- name = "banana spider"
- desc = "You do not know what it is, but you can bet the clown would love it."
- icon = 'modular_citadel/icons/mob/BananaSpider.dmi'
- icon_state = "banana"
- item_state = "banana"
- filling_color = "#FFFF00"
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
- foodtype = GROSS | MEAT | RAW | FRUIT
- grind_results = list(/datum/reagent/blood = 20, /datum/reagent/liquidgibs = 5)
- juice_results = list(/datum/reagent/consumable/banana = 0)
- var/awakening = 0
-
-
-/obj/item/reagent_containers/food/snacks/grown/banana/banana_spider_spawnable/attack_self(mob/user)
- if(awakening || isspaceturf(user.loc))
- return
- to_chat(user, "You decide to wake up the banana spider...")
- awakening = 1
-
- spawn(30)
- if(!QDELETED(src))
- var/mob/living/simple_animal/banana_spider/S = new /mob/living/simple_animal/banana_spider(get_turf(src.loc))
- S.speed += round(10 / seed.potency)
- S.visible_message("The banana spider chitters as it stretches its legs.")
- qdel(src)
-
-
/mob/living/simple_animal/banana_spider
icon = 'modular_citadel/icons/mob/BananaSpider.dmi'
name = "banana spider"
diff --git a/tgstation.dme b/tgstation.dme
index 5158277d..0f9ce34b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1823,6 +1823,7 @@
#include "code\modules\hydroponics\gene_modder.dm"
#include "code\modules\hydroponics\grown.dm"
#include "code\modules\hydroponics\growninedible.dm"
+#include "code\modules\hydroponics\hydro_chemreact.dm"
#include "code\modules\hydroponics\hydroitemdefines.dm"
#include "code\modules\hydroponics\hydroponics.dm"
#include "code\modules\hydroponics\plant_genes.dm"
@@ -1857,6 +1858,7 @@
#include "code\modules\hydroponics\grown\onion.dm"
#include "code\modules\hydroponics\grown\peach.dm"
#include "code\modules\hydroponics\grown\peanuts.dm"
+#include "code\modules\hydroponics\grown\peas.dm"
#include "code\modules\hydroponics\grown\pineapple.dm"
#include "code\modules\hydroponics\grown\potato.dm"
#include "code\modules\hydroponics\grown\pumpkin.dm"
diff --git a/tgui-next/packages/tgui/interfaces/biogenerator.js b/tgui-next/packages/tgui/interfaces/biogenerator.js
new file mode 100644
index 00000000..ee109206
--- /dev/null
+++ b/tgui-next/packages/tgui/interfaces/biogenerator.js
@@ -0,0 +1,192 @@
+import { classes } from 'common/react';
+import { createSearch } from 'common/string';
+import { Fragment } from 'inferno';
+import { useBackend, useLocalState } from '../backend';
+import { Box, Button, Dimmer, Flex, Icon, Input, NoticeBox, NumberInput, Section, Table, Tabs } from '../components';
+import { formatMoney } from '../format';
+import { Window } from '../layouts';
+
+const MAX_SEARCH_RESULTS = 25;
+
+export const Biogenerator = (props, context) => {
+ const { data } = useBackend(context);
+ const {
+ beaker,
+ processing,
+ } = data;
+ return (
+
+ {!!processing && (
+
+
+ {' Processing...'}
+
+ )}
+
+ {!beaker && (
+ No Container
+ )}
+ {!!beaker && (
+
+ )}
+
+
+ );
+};
+
+export const BiogeneratorContent = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ biomass,
+ can_process,
+ categories = [],
+ } = data;
+ const [
+ searchText,
+ setSearchText,
+ ] = useLocalState(context, 'searchText', '');
+ const [
+ selectedCategory,
+ setSelectedCategory,
+ ] = useLocalState(context, 'category', categories[0]?.name);
+ const testSearch = createSearch(searchText, item => {
+ return item.name;
+ });
+ const items = searchText.length > 0
+ // Flatten all categories and apply search to it
+ && categories
+ .flatMap(category => category.items || [])
+ .filter(testSearch)
+ .filter((item, i) => i < MAX_SEARCH_RESULTS)
+ // Select a category and show all items in it
+ || categories
+ .find(category => category.name === selectedCategory)
+ ?.items
+ // If none of that results in a list, return an empty list
+ || [];
+ return (
+
+ );
+};
+
+const ItemList = (props, context) => {
+ const { act } = useBackend(context);
+ const [
+ hoveredItem,
+ setHoveredItem,
+ ] = useLocalState(context, 'hoveredItem', {});
+ const hoveredCost = hoveredItem && hoveredItem.cost || 0;
+ // Append extra hover data to items
+ const items = props.items.map(item => {
+ const [
+ amount,
+ setAmount,
+ ] = useLocalState(context, "amount" + item.name, 1);
+ const notSameItem = hoveredItem && hoveredItem.name !== item.name;
+ const notEnoughHovered = props.biomass - hoveredCost
+ * hoveredItem.amount < item.cost * amount;
+ const disabledDueToHovered = notSameItem && notEnoughHovered;
+ const disabled = props.biomass < item.cost * amount || disabledDueToHovered;
+ return {
+ ...item,
+ disabled,
+ amount,
+ setAmount,
+ };
+ });
+ return items.map(item => (
+
+
+
+ {' '}{item.name}
+
+
+ item.setAmount(value)} />
+
+
+
+
+ ));
+};