From c7644c78772d32db6ea7a1684aa6370311cbc52a Mon Sep 17 00:00:00 2001 From: Will <7099514+Willburd@users.noreply.github.com> Date: Thu, 26 Mar 2026 21:08:04 -0400 Subject: [PATCH] Xenobotany machines can be constructed (#19342) * required * fixes for contents * prevent deconstruction while activated * node already existed * part stuff * corrected nodes * oops --- code/game/machinery/seed_extractor.dm | 29 ++++++++++++++--- .../items/weapons/circuitboards/frame.dm | 27 ++++++++++++++++ code/modules/hydroponics/seed_machines.dm | 31 ++++++++++++++++--- .../research/tg/designs/boards/science.dm | 28 +++++++++++++++++ .../tg/techwebs/nodes/biology_nodes.dm | 4 ++- 5 files changed, 108 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 7c53eac5b5c..b3a916acb97 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -5,6 +5,16 @@ icon_state = "sextractor" density = TRUE anchored = TRUE + circuit = /obj/item/circuitboard/botany_seedextractor + +/obj/machinery/seed_extractor/Initialize(mapload) + . = ..() + default_apply_parts() + +/* Currently part upgrades do nothing +/obj/machinery/seed_extractor/RefreshParts() + ..() +*/ /obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob) @@ -32,20 +42,29 @@ to_chat(user, "[O] doesn't seem to have any usable seeds inside it.") qdel(O) + return //Grass. - else if(istype(O, /obj/item/stack/tile/grass)) + if(istype(O, /obj/item/stack/tile/grass)) var/obj/item/stack/tile/grass/S = O if(S.use(1)) to_chat(user, span_notice("You extract some seeds from the grass tile.")) new /obj/item/seeds/grassseed(loc) + return - else if(istype(O, /obj/item/fossil/plant)) // Fossils + // Fossils + if(istype(O, /obj/item/fossil/plant)) var/obj/item/seeds/random/R = new(get_turf(src)) to_chat(user, "\The [src] pulverizes \the [O] and spits out \the [R].") qdel(O) - - else if(default_unfasten_wrench(user, O, 20)) return - return + // Deconstruction + if(default_deconstruction_screwdriver(user, O)) + return + if(default_deconstruction_crowbar(user, O)) + return + if(default_part_replacement(user, O)) + return + if(default_unfasten_wrench(user, O, 20)) + return diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index 111db54b8d5..19f439df050 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -384,3 +384,30 @@ req_components = list( /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/motor = 1) + +/obj/item/circuitboard/botany_extractor + name = T_BOARD("lysis-isolation centrifuge") + build_path = /obj/machinery/botany/extractor + board_type = new /datum/frame/frame_types/machine + req_components = list( + /obj/item/stock_parts/motor = 2, + /obj/item/stock_parts/scanning_module = 2, + /obj/item/stock_parts/gear = 3) + +/obj/item/circuitboard/botany_editor + name = T_BOARD("bioballistic delivery system") + build_path = /obj/machinery/botany/editor + board_type = new /datum/frame/frame_types/machine + req_components = list( + /obj/item/stock_parts/capacitor = 2, + /obj/item/stock_parts/scanning_module = 2, + /obj/item/stock_parts/manipulator = 2) + +/obj/item/circuitboard/botany_seedextractor + name = T_BOARD("seed extractor") + build_path = /obj/machinery/seed_extractor + board_type = new /datum/frame/frame_types/machine + req_components = list( + /obj/item/stock_parts/motor = 1, + /obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/console_screen = 1) diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 56fbf5fcb9d..ac707818890 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -53,6 +53,22 @@ var/failed_task = 0 var/disk_needs_genes = 0 +/obj/machinery/botany/Initialize(mapload) + . = ..() + default_apply_parts() + +/* Currently part upgrades do nothing +/obj/machinery/botany/RefreshParts() + ..() +*/ + +/obj/machinery/botany/Destroy() + if(seed) + seed.forceMove(get_turf(src)) + if(loaded_disk) + loaded_disk.forceMove(get_turf(src)) + . = ..() + /obj/machinery/botany/process() ..() @@ -78,7 +94,7 @@ if(eject_disk) eject_disk = 0 if(loaded_disk) - loaded_disk.loc = get_turf(src) + loaded_disk.forceMove(get_turf(src)) visible_message(span_filter_notice("[icon2html(src,viewers(src))] [src] beeps and spits out [loaded_disk].")) loaded_disk = null @@ -92,7 +108,7 @@ to_chat(user, span_filter_notice("That seed is not compatible with our genetics technology.")) else user.drop_from_inventory(W) - W.loc = src + W.forceMove(src) seed = W to_chat(user, span_filter_notice("You load [W] into [src].")) return @@ -104,8 +120,11 @@ to_chat(user, span_notice("You [anchored ? "un" : ""]secure \the [src].")) anchored = !anchored return -// if(default_deconstruction_crowbar(user, W)) //No circuit boards to give. -// return + if(!active) + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return if(istype(W,/obj/item/disk/botany)) if(loaded_disk) to_chat(user, span_filter_notice("There is already a data disk loaded.")) @@ -123,7 +142,7 @@ return user.drop_from_inventory(W) - W.loc = src + W.forceMove(src) loaded_disk = W to_chat(user, span_filter_notice("You load [W] into [src].")) @@ -137,6 +156,7 @@ var/datum/seed/genetics // Currently scanned seed genetic structure. var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point. + circuit = /obj/item/circuitboard/botany_extractor /obj/machinery/botany/extractor/tgui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -265,6 +285,7 @@ name = "bioballistic delivery system" icon_state = "traitgun" disk_needs_genes = 1 + circuit = /obj/item/circuitboard/botany_editor /obj/machinery/botany/editor/tgui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/research/tg/designs/boards/science.dm b/code/modules/research/tg/designs/boards/science.dm index 026ca626b51..7bfe43d1b9f 100644 --- a/code/modules/research/tg/designs/boards/science.dm +++ b/code/modules/research/tg/designs/boards/science.dm @@ -197,6 +197,34 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING +// Xenobotany +/datum/design_techweb/board/botany_extractor + SET_CIRCUIT_DESIGN_NAMEDESC("lysis-isolation centrifuge") + id = "botany_extractor" + build_path = /obj/item/circuitboard/botany_extractor + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_BOTANY + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/board/botany_editor + SET_CIRCUIT_DESIGN_NAMEDESC("bioballistic delivery system") + id = "botany_editor" + build_path = /obj/item/circuitboard/botany_editor + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_BOTANY + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/board/botany_seedextractor + SET_CIRCUIT_DESIGN_NAMEDESC("seed extractor") + id = "seed_extractor" + build_path = /obj/item/circuitboard/botany_seedextractor + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_BOTANY + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + /datum/design_techweb/board/destructive_analyzer SET_CIRCUIT_DESIGN_NAMEDESC("destructive analyzer") id = "destructive_analyzer" diff --git a/code/modules/research/tg/techwebs/nodes/biology_nodes.dm b/code/modules/research/tg/techwebs/nodes/biology_nodes.dm index 7ef4dcbd971..6639d68f787 100644 --- a/code/modules/research/tg/techwebs/nodes/biology_nodes.dm +++ b/code/modules/research/tg/techwebs/nodes/biology_nodes.dm @@ -86,7 +86,7 @@ description = "Essential tools for maintaining onboard gardens, supporting plant growth in the unique environment of the space station." design_ids = list( "plant_analyzer", - // "seed_extractor", + "seed_extractor", // "watering_can", "spade", // "cultivator", @@ -115,6 +115,8 @@ design_ids = list( "flora_gun", "disk_botany", + "botany_extractor", + "botany_editor", // "gene_shears", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS)