diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index baee9ab7b06..32a4460536d 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -46,7 +46,6 @@
/obj/item/stack/sheet/sinew = GLOB.sinew_recipes,
/obj/item/stack/sheet/animalhide/carp = GLOB.carp_recipes,
/obj/item/stack/sheet/mineral/sandstone = GLOB.sandstone_recipes,
- /obj/item/stack/sheet/mineral/clay = GLOB.clay_recipes, // SKYRAT EDIT ADDITION
/obj/item/stack/sheet/mineral/sandbags = GLOB.sandbag_recipes,
/obj/item/stack/sheet/mineral/diamond = GLOB.diamond_recipes,
/obj/item/stack/sheet/mineral/uranium = GLOB.uranium_recipes,
diff --git a/modular_skyrat/modules/primitive_production/code/ceramics.dm b/modular_skyrat/modules/primitive_production/code/ceramics.dm
index b04fdad9fa5..edc5614d0a4 100644
--- a/modular_skyrat/modules/primitive_production/code/ceramics.dm
+++ b/modular_skyrat/modules/primitive_production/code/ceramics.dm
@@ -1,29 +1,5 @@
#define DEFAULT_SPIN (4 SECONDS)
-/*
- * Clay Bricks
- */
-
-/obj/item/stack/sheet/mineral/clay
- name = "clay brick"
- desc = "A heavy clay brick."
- singular_name = "clay brick"
- icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi'
- icon_state = "sheet-clay"
- inhand_icon_state = null
- throw_speed = 3
- throw_range = 5
- merge_type = /obj/item/stack/sheet/mineral/clay
-
-GLOBAL_LIST_INIT(clay_recipes, list ( \
- new/datum/stack_recipe("clay range", /obj/machinery/primitive_stove, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \
- new/datum/stack_recipe("clay oven", /obj/machinery/oven/stone, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_MISC) \
- ))
-
-/obj/item/stack/sheet/mineral/clay/get_main_recipes()
- . = ..()
- . += GLOB.clay_recipes
-
/obj/structure/water_source/puddle/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/stack/ore/glass))
var/obj/item/stack/ore/glass/glass_item = O
@@ -151,12 +127,15 @@ GLOBAL_LIST_INIT(clay_recipes, list ( \
icon_state = "clay_cup"
custom_materials = null
+/obj/item/stack/sheet/mineral/stone/five
+ amount = 5
+
/obj/item/ceramic/brick
- name = "ceramic brick"
- desc = "A dense block of clay, ready to be fired into a brick!"
+ name = "clay bricks"
+ desc = "A few block of clay, ready to be fired into bricks!"
icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi'
- icon_state = "sheet-clay"
- forge_item = /obj/item/stack/sheet/mineral/clay
+ icon_state = "claybricks"
+ forge_item = /obj/item/stack/sheet/mineral/stone/five
/obj/structure/throwing_wheel
name = "throwing wheel"
@@ -238,7 +217,7 @@ GLOBAL_LIST_INIT(clay_recipes, list ( \
return
switch(user_input)
if("Create")
- var/creation_choice = tgui_input_list(user, "What you like to create?", "Creation Choice", list("Cup", "Plate", "Bowl", "Tray", "Brick"))
+ var/creation_choice = tgui_input_list(user, "What you like to create?", "Creation Choice", list("Cup", "Plate", "Bowl", "Tray", "Bricks"))
if(!creation_choice)
return
switch(creation_choice)
@@ -250,7 +229,7 @@ GLOBAL_LIST_INIT(clay_recipes, list ( \
use_clay(/obj/item/ceramic/bowl, user)
if("Tray")
use_clay(/obj/item/ceramic/tray, user)
- if("Brick")
+ if("Bricks")
use_clay(/obj/item/ceramic/brick, user)
if("Remove")
if(!do_after(user, spinning_speed, target = src))
diff --git a/modular_skyrat/modules/primitive_production/code/hydroponics.dm b/modular_skyrat/modules/primitive_production/code/hydroponics.dm
new file mode 100644
index 00000000000..f4c56206f8a
--- /dev/null
+++ b/modular_skyrat/modules/primitive_production/code/hydroponics.dm
@@ -0,0 +1,313 @@
+/obj/machinery/hydroponics/soil/soilbin //Just a big ol' tub of dirt.
+ name = "soilbin"
+ desc = "I've got a box of dirt! and guess what's inside it!... Yes, dirt."
+ icon = 'modular_skyrat/modules/primitive_structures/icons/storage.dmi'
+ icon_state = "soilbin"
+ gender = PLURAL
+ circuit = null
+ density = FALSE
+ use_power = NO_POWER_USE
+ unwrenchable = FALSE
+ self_sustaining_overlay_icon_state = null
+ self_sustaining = 0
+ maxnutri = 30
+ maxwater = 300
+
+/datum/crafting_recipe/soilbin
+ name = "Primitive soilbin"
+ result = /obj/machinery/hydroponics/soil/soilbin
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 10,
+ /obj/item/stack/sheet/mineral/sandstone = 5)
+ time = 60
+ category = CAT_MISC
+
+/obj/machinery/hydroponics/soil/soilbin/crowbar_act(mob/living/user, obj/item/tool)
+ user.balloon_alert_to_viewers("disassembling...")
+ if(!tool.use_tool(src, user, 10 SECONDS, volume = 100))
+ return
+ new /obj/item/stack/sheet/mineral/wood(drop_location(), 10)
+ new /obj/item/stack/sheet/mineral/sandstone(drop_location(), 5)
+ deconstruct(TRUE)
+ return ITEM_INTERACT_SUCCESS
+
+/obj/machinery/hydroponics/soil/soilbin/gaia //Just a big ol' tub of glowning dirt.
+ name = "gaian soilbin"
+ desc = "I've got a box of dirt! and guess what's inside it!... Yes, dirt AND Gaia."
+ icon = 'modular_skyrat/modules/primitive_structures/icons/storage.dmi'
+ icon_state = "soilbin"
+ gender = PLURAL
+ circuit = null
+ density = FALSE //You can step over them like a dirt pile.
+ use_power = NO_POWER_USE
+ unwrenchable = FALSE
+ self_sustaining_overlay_icon_state = "gaia"
+ self_sustaining = 1
+ maxnutri = 50
+ maxwater = 500
+
+/datum/crafting_recipe/soilbin/gaia
+ name = "Primitive gaian soilbin"
+ result = /obj/machinery/hydroponics/soil/soilbin/gaia
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 10,
+ /obj/item/stack/sheet/mineral/sandstone = 5,
+ /obj/item/food/grown/ambrosia/gaia = 10)
+ time = 60
+ category = CAT_MISC
+
+/obj/machinery/hydroponics/soil/soilbin/gaia/crowbar_act(mob/living/user, obj/item/tool)
+ user.balloon_alert_to_viewers("disassembling...")
+ if(!tool.use_tool(src, user, 10 SECONDS, volume = 100))
+ return
+ new /obj/item/stack/sheet/mineral/wood(drop_location(), 10)
+ new /obj/item/stack/sheet/mineral/sandstone(drop_location(), 5)
+ deconstruct(TRUE)
+ return ITEM_INTERACT_SUCCESS
+
+/datum/crafting_recipe/compostbin
+ name = "Primitive compost"
+ result = /obj/machinery/compostbin
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 10)
+ time = 60
+ category = CAT_MISC
+
+/obj/machinery/compostbin
+ name = "compost bin"
+ desc = "A smelly structure made of wooden slats. Dump produce in, pull usable compost out."
+ icon = 'modular_skyrat/modules/primitive_structures/icons/storage.dmi'
+ icon_state = "compostbin"
+ base_icon_state = "compost"
+ anchored = TRUE
+ density = TRUE
+ use_power = NO_POWER_USE
+ idle_power_usage = 0
+ var/reagent_id = /datum/reagent/plantnutriment/eznutriment/compost
+ var/user_sees_reagents = TRUE
+ var/visible_contents = TRUE
+ var/processing = FALSE
+ var/processed_items_per_cycle = 5
+ var/max_items = 20
+ var/current_item_count = 0
+
+
+/obj/machinery/compostbin/Initialize(mapload)
+ . = ..()
+ create_reagents(1000, DRAINABLE)
+
+/obj/machinery/compostbin/examine(mob/user)
+ . = ..()
+ . += span_notice("The compost bin has: [reagents.total_volume] units.")
+ . += span_notice("The compost bin can hold: [reagents.maximum_volume] units.")
+
+/obj/machinery/compostbin/proc/visible_volume()
+ return reagents.total_volume
+
+/obj/machinery/compostbin/attacked_by(obj/item/weapon, mob/living/user)
+ if(!machine_stat)
+ if(user.combat_mode)
+ return ..()
+
+ if(istype(weapon, /obj/item/storage/bag))
+ if(reagents.total_volume >= reagents.maximum_volume)
+ to_chat(user, span_warning("\The [src] is already full of compost."))
+ return TRUE
+
+ if(current_item_count >= max_items)
+ to_chat(user, span_warning("\The [src] is already full of produce! Wait for it to decompose."))
+ return TRUE
+
+ var/obj/item/storage/bag/bag = weapon
+
+ for(var/obj/item/food/item in bag.contents)
+ if(current_item_count >= max_items)
+ break
+
+ if(bag.atom_storage.attempt_remove(item, src))
+ current_item_count++
+
+ if(bag.contents.len == 0)
+ to_chat(user, span_info("You empty \the [bag] into \the [src]."))
+
+ else if (current_item_count >= max_items)
+ to_chat(user, span_info("You fill \the [src] from \the [bag] to its capacity."))
+
+ else
+ to_chat(user, span_info("You fill \the [src] from \the [bag]."))
+
+ start_process()
+ return TRUE //no afterattack
+
+ else if(istype(weapon, /obj/item/food))
+ if(reagents.total_volume >= reagents.maximum_volume)
+ to_chat(user, span_warning("\The [src] is already full of compost."))
+ return TRUE
+
+ if(current_item_count >= max_items)
+ to_chat(user, span_warning("\The [src] is already full of produce! Wait for it to decompose."))
+
+ else
+ if(user.transferItemToLoc(weapon, src))
+ current_item_count++
+ to_chat(user, span_info("You insert \the [weapon] in \the [src]"))
+
+ start_process()
+ return TRUE //no afterattack
+
+ else
+ to_chat(user, span_warning("You cannot put \the [weapon] in \the [src]!"))
+
+/obj/machinery/compostbin/proc/start_process()
+ if(machine_stat != NONE)
+ return
+
+ if(!(locate(/obj/item/food) in contents))
+ return
+
+ begin_processing()
+ processing = TRUE
+ update_appearance()
+
+/obj/machinery/compostbin/process(seconds_per_tick)
+ if(!processing)
+ return
+
+ if(machine_stat != NONE)
+ stop_process()
+ return
+
+ if(!current_item_count)
+ stop_process()
+ return
+
+ for(var/i in 1 to processed_items_per_cycle)
+ var/obj/item/food/food_to_convert = locate(/obj/item/food) in contents
+
+ if(!food_to_convert)
+ break
+
+ if(food_to_convert.flags_1 & HOLOGRAM_1)
+ qdel(food_to_convert)
+ current_item_count = max(current_item_count - 1, 0)
+ continue
+
+ convert_to_compost(food_to_convert)
+
+ if(!current_item_count)
+ stop_process(FALSE)
+
+ update_appearance()
+
+/obj/machinery/compostbin/proc/stop_process(update_appearance = TRUE)
+ end_processing()
+ processing = FALSE
+
+ if(update_appearance)
+ update_appearance()
+
+/obj/machinery/compostbin/proc/convert_to_compost(obj/item/food/food_to_convert)
+ var/nutriments = ROUND_UP(food_to_convert.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment, type_check = REAGENT_PARENT_TYPE))
+ qdel(food_to_convert)
+ current_item_count = max(current_item_count - 1, 0)
+ reagents.add_reagent(reagent_id, nutriments)
+
+
+/obj/machinery/compostbin/update_appearance(updates=ALL)
+ . = ..()
+
+/obj/machinery/compostbin/update_overlays()
+ . = ..()
+
+ var/initial_icon_state = initial(icon_state)
+ var/shown_contents_length = visible_volume()
+ if(visible_contents && shown_contents_length)
+ var/content_level = "[initial_icon_state]-[base_icon_state]"
+ switch(shown_contents_length)
+ if(1 to 349)
+ content_level += "-1"
+ if(350 to 749)
+ content_level += "-2"
+ if(750 to 1000)
+ content_level += "-3"
+ . += mutable_appearance(icon, content_level)
+
+/obj/machinery/compostbin/welder_act(mob/living/user, obj/item/tool)
+ return NONE
+
+/obj/machinery/compostbin/welder_act_secondary(mob/living/user, obj/item/tool)
+ return NONE
+
+/obj/machinery/compostbin/default_deconstruction_screwdriver()
+ return NONE
+
+/obj/machinery/compostbin/exchange_parts()
+ return
+
+/obj/machinery/compostbin/crowbar_act(mob/living/user, obj/item/tool)
+ user.balloon_alert_to_viewers("disassembling...")
+ if(!tool.use_tool(src, user, 10 SECONDS, volume = 100))
+ return
+ new /obj/item/stack/sheet/mineral/wood(drop_location(), 10)
+ deconstruct(TRUE)
+ return ITEM_INTERACT_SUCCESS
+
+/datum/reagent/plantnutriment/eznutriment/compost //Basic compost (E-Z nutrients)
+ name = "Basic compost"
+ description = "Rotting plant matter, stinky."
+ color = "#422813"
+
+/datum/reagent/plantnutriment/eznutriment/compost/enhanced //Saltpetre and diethymix (Slightly worse than both combined)
+ name = "Fertile compost"
+ description = "Very fertile, rotting plant matter, stinky."
+ color = "#6b963b"
+
+/datum/reagent/plantnutriment/eznutriment/compost/enhanced/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user)
+ mytray.adjust_plant_health(round(volume * 0.5))
+ mytray.myseed?.adjust_production(-round(volume / 5)-prob(volume % 10))
+ mytray.myseed?.adjust_potency(round(volume))
+ mytray.adjust_pestlevel(-rand(1,2))
+ var/obj/item/seeds/myseed = mytray.myseed
+ if(!isnull(myseed))
+ myseed.adjust_yield(round(volume))
+ myseed.adjust_instability(-round(volume))
+
+/datum/reagent/plantnutriment/left4zednutriment/compost //Left for Zed
+ name = "Reactive compost"
+ description = "A rancid smelling concoction that'll really change up your plants."
+ color = "#122b29"
+
+/datum/reagent/plantnutriment/endurogrow/compost //Endurogrow: Lifespan and Endurance up, yield and potency crippled.
+ name = "Hearty compost"
+ description = "A useful compost, while it might leave your plants stronger, it'll jeopardise your fruits."
+ color = "#4f5010"
+
+/datum/chemical_reaction/compost
+ results = list(/datum/reagent/plantnutriment/eznutriment/compost/enhanced = 2)
+ required_reagents = list(/datum/reagent/plantnutriment/eznutriment/compost = 1, /datum/reagent/medicine/earthsblood = 1)
+ required_temp = 200
+ optimal_temp = 700
+ overheat_temp = 1000
+ optimal_ph_min = 1
+ optimal_ph_max = 14
+ reaction_tags = REACTION_TAG_EASY
+
+/datum/chemical_reaction/compost/leftforzed
+ results = list(/datum/reagent/plantnutriment/left4zednutriment/compost = 2)
+ required_reagents = list(/datum/reagent/plantnutriment/eznutriment/compost = 1, /datum/reagent/drug/nicotine = 1) //Smoking doesn't cause cancer.
+
+/datum/chemical_reaction/compost/endurogrow
+ results = list(/datum/reagent/plantnutriment/endurogrow/compost = 2)
+ required_reagents = list(/datum/reagent/plantnutriment/eznutriment/compost = 1, /datum/reagent/medicine/omnizine = 1)
+
+
+/obj/item/secateurs/wooden
+ name = "primitive secateurs"
+ desc = "Some shoddy looking secateurs, they look sturdy enough to get a graft... or poke someone in both eyes at once!"
+ icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi'
+ icon_state = "woodensecateurs"
+
+/datum/crafting_recipe/secateur
+ name = "Primitive secateurs"
+ result = /obj/item/secateurs/wooden
+ reqs = list(/obj/item/stack/sheet/iron = 2,
+ /obj/item/stack/sheet/mineral/wood = 6)
+ time = 160
+ category = CAT_MISC
diff --git a/modular_skyrat/modules/primitive_production/icons/prim_fun.dmi b/modular_skyrat/modules/primitive_production/icons/prim_fun.dmi
index 1caf775d682..aac7a73b735 100644
Binary files a/modular_skyrat/modules/primitive_production/icons/prim_fun.dmi and b/modular_skyrat/modules/primitive_production/icons/prim_fun.dmi differ
diff --git a/modular_skyrat/modules/primitive_structures/code/storage_structures.dm b/modular_skyrat/modules/primitive_structures/code/storage_structures.dm
index afdee5b7301..c9932d6e7a3 100644
--- a/modular_skyrat/modules/primitive_structures/code/storage_structures.dm
+++ b/modular_skyrat/modules/primitive_structures/code/storage_structures.dm
@@ -22,14 +22,10 @@
user.balloon_alert_to_viewers("disassembling...")
if(!tool.use_tool(src, user, 2 SECONDS, volume = 100))
return
- new /obj/item/stack/sheet/mineral/clay(drop_location(), 5)
+ new /obj/item/stack/sheet/mineral/wood(drop_location(), 2)
deconstruct(TRUE)
return ITEM_INTERACT_SUCCESS
-/obj/structure/rack/wooden/atom_deconstruct(disassembled = TRUE)
- new /obj/item/stack/sheet/mineral/wood(drop_location(), 2)
- return ..()
-
// Barrel but it works like a crate
/obj/structure/closet/crate/wooden/storage_barrel
@@ -106,7 +102,7 @@
/obj/machinery/smartfridge/wooden/ration_shelf
name = "Ration shelf"
desc = "A wooden shelf, used to store food... preferably preserved."
- icon_state = "rationshelf"
+ icon_state = "seedshelf"
base_build_path = /obj/machinery/smartfridge/wooden/ration_shelf
base_icon_state = "ration"
diff --git a/modular_skyrat/modules/primitive_structures/icons/storage.dmi b/modular_skyrat/modules/primitive_structures/icons/storage.dmi
index 413a49e7eaa..b5882383643 100644
Binary files a/modular_skyrat/modules/primitive_structures/icons/storage.dmi and b/modular_skyrat/modules/primitive_structures/icons/storage.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 67f2da01f13..51ca4d46f60 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -8140,6 +8140,7 @@
#include "modular_skyrat\modules\primitive_production\code\ceramics.dm"
#include "modular_skyrat\modules\primitive_production\code\construction.dm"
#include "modular_skyrat\modules\primitive_production\code\glassblowing.dm"
+#include "modular_skyrat\modules\primitive_production\code\hydroponics.dm"
#include "modular_skyrat\modules\primitive_production\code\misc.dm"
#include "modular_skyrat\modules\primitive_production\code\primitive.dm"
#include "modular_skyrat\modules\primitive_production\code\production_skill.dm"