From b662ee76659e93d651230be4db97e0c750287c6b Mon Sep 17 00:00:00 2001
From: xXPawnStarrXx <53197594+xXPawnStarrXx@users.noreply.github.com>
Date: Sun, 16 Jun 2024 23:46:25 +0100
Subject: [PATCH] Primitive Farming additions & changes (#28205)
* Update global_lists.dm
* Update ceramics.dm
* Update storage_structures.dm
* Add files via upload
* Add files via upload
* Update storage_structures.dm
* Add files via upload
* Update ceramics.dm
* Add files via upload
* Add files via upload
* Update tgstation.dme
* Add files via upload
---
code/__HELPERS/global_lists.dm | 1 -
.../primitive_production/code/ceramics.dm | 39 +--
.../primitive_production/code/hydroponics.dm | 313 ++++++++++++++++++
.../primitive_production/icons/prim_fun.dmi | Bin 4209 -> 4014 bytes
.../code/storage_structures.dm | 8 +-
.../primitive_structures/icons/storage.dmi | Bin 2845 -> 7395 bytes
tgstation.dme | 1 +
7 files changed, 325 insertions(+), 37 deletions(-)
create mode 100644 modular_skyrat/modules/primitive_production/code/hydroponics.dm
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 1caf775d6829a6d53f572d6da64c1caf6f2d23a3..aac7a73b735f423ded8d9d59258adeb2c4eaa0cb 100644
GIT binary patch
literal 4014
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
N{&iz`sg6^`{{g`+`yT)R
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 413a49e7eaa18394b69bedccb549848fcc11d50b..b588238364315994c9c388b7d6f397919c94ac16 100644
GIT binary patch
literal 7395
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
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"