From 59712fa58a3d432ad5038c164a328685462b3450 Mon Sep 17 00:00:00 2001 From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Thu, 14 Dec 2023 03:17:26 -0500 Subject: [PATCH] RCD, Airlock QoL (#8195) * stuff * requested changes part 1 * 515 * sanitize, fix conflicts * prettierX * fix mat inserting, remove duplicate attackby * radial * fix glass table radials --- code/__DEFINES/construction.dm | 29 +- code/game/machinery/doors/airlock.dm | 9 +- .../machinery/doors/airlock_electronics.dm | 14 + code/game/machinery/doors/door.dm | 4 +- code/game/machinery/doors/windowdoor.dm | 42 ++- code/game/objects/items/RCD.dm | 250 +++++++++++++----- code/game/objects/items/debug_items.dm | 2 +- code/game/objects/items/stacks/rods/rods.dm | 1 + .../items/stacks/sheets/mineral/glass.dm | 3 + .../items/stacks/sheets/mineral/metals.dm | 2 + code/game/objects/items/stacks/stack.dm | 2 + .../objects/items/stacks/tiles/tile_types.dm | 1 + code/game/objects/structures/door_assembly.dm | 5 + code/game/objects/structures/grille.dm | 11 +- code/game/objects/structures/tables_racks.dm | 13 + code/game/turfs/open/floor.dm | 77 ++++-- code/modules/mining/aux_base_camera.dm | 4 +- code/modules/research/designs/tool_designs.dm | 10 + code/modules/research/techweb/all_nodes.dm | 3 +- icons/mob/radial.dmi | Bin 16292 -> 20778 bytes .../tgui/interfaces/AirlockElectronics.js | 28 +- 21 files changed, 395 insertions(+), 115 deletions(-) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 973196b2a269d..81d386776e7fd 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -101,17 +101,26 @@ #define CAT_DRINK "Drinks" #define CAT_STRUCTURE "Structures" + // rcd buildtype defines -#define RCD_FLOORWALL 1 -#define RCD_AIRLOCK 2 -#define RCD_DECONSTRUCT 3 -#define RCD_WINDOWGRILLE 4 -#define RCD_LADDER 5 -#define RCD_MACHINE 8 -#define RCD_COMPUTER 16 - -#define RCD_UPGRADE_FRAMES (1<<0) +// these aren't even used as bitflags so who even knows why they are treated like them +#define RCD_FLOORWALL (1<<0) +#define RCD_AIRLOCK (1<<1) +#define RCD_DECONSTRUCT (1<<2) +#define RCD_WINDOWGRILLE (1<<3) +#define RCD_MACHINE (1<<4) +#define RCD_COMPUTER (1<<5) +#define RCD_FURNISHING (1<<6) +#define RCD_LADDER (1<<7) + +#define RCD_UPGRADE_FRAMES (1<<0) #define RCD_UPGRADE_SIMPLE_CIRCUITS (1<<1) -#define RCD_UPGRADE_SILO_LINK (1<<2) +#define RCD_UPGRADE_SILO_LINK (1<<2) +#define RCD_UPGRADE_FURNISHING (1<<3) + +#define RCD_WINDOW_FULLTILE "full tile" +#define RCD_WINDOW_DIRECTIONAL "directional" +#define RCD_WINDOW_NORMAL "glass" +#define RCD_WINDOW_REINFORCED "reinforced glass" #define RPD_UPGRADE_UNWRENCH (1<<0) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5fbd9337b2583..6ca05f8a54558 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -203,7 +203,10 @@ /obj/machinery/door/airlock/proc/update_other_id() for(var/obj/machinery/door/airlock/Airlock in GLOB.airlocks) if(Airlock.closeOtherId == closeOtherId && Airlock != src) - close_others += Airlock + if(!(Airlock in close_others)) + close_others += Airlock + if(!(src in Airlock.close_others)) + Airlock.close_others += src /obj/machinery/door/airlock/proc/cyclelinkairlock() if (cyclelinkedairlock) @@ -721,6 +724,10 @@ /obj/machinery/door/airlock/examine(mob/user) . = ..() + if(closeOtherId) + . += "This airlock cycles on ID: [sanitize(closeOtherId)]." + if(obj_flags & EMAGGED) + . += "Its access panel is smoking slightly." if(charge && !panel_open && in_range(user, src)) . += "The maintenance panel seems haphazardly fastened." if(charge && panel_open) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 222ae936a0dca..114bfa0b88c9c 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -8,6 +8,10 @@ var/one_access = 0 /// Unrestricted sides, or sides of the airlock that will open regardless of access var/unres_sides = 0 + ///what name are we passing to the finished airlock + var/passed_name + ///what string are we passing to the finished airlock as the cycle ID + var/passed_cycle_id /// A holder of the electronics, in case of them working as an integrated part var/holder @@ -51,6 +55,8 @@ data["accesses"] = accesses data["oneAccess"] = one_access data["unres_direction"] = unres_sides + data["passedName"] = passed_name + data["passedCycleId"] = passed_cycle_id return data /obj/item/electronics/airlock/ui_act(action, params) @@ -90,6 +96,14 @@ return accesses -= get_region_accesses(region) . = TRUE + if("passedName") + var/new_name = trim(sanitize("[params["passedName"]]"), 30) + passed_name = new_name + . = TRUE + if("passedCycleId") + var/new_cycle_id = trim(sanitize(params["passedCycleId"]), 30) + passed_cycle_id = new_cycle_id + . = TRUE /obj/item/electronics/airlock/ui_host() if(holder) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 39af859b4576a..9025b997b7dc6 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -193,8 +193,8 @@ return TRUE return ..() -/obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) - return get_dir(src, M) & unres_sides +/obj/machinery/door/proc/unrestricted_side(mob/opener) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) + return get_dir(src, opener) & unres_sides /obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user) return diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 7321d5a7aa380..0fc90e773cef5 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -26,7 +26,7 @@ var/cable = 1 var/list/debris = list() -/obj/machinery/door/window/Initialize(mapload, set_dir) +/obj/machinery/door/window/Initialize(mapload, set_dir, unres_sides) . = ..() if(set_dir) setDir(set_dir) @@ -40,6 +40,19 @@ if(cable) debris += new /obj/item/stack/cable_coil(src, cable) + if(unres_sides) + //remove unres_sides from directions it can't be bumped from + switch(dir) + if(NORTH,SOUTH) + unres_sides &= ~EAST + unres_sides &= ~WEST + if(EAST,WEST) + unres_sides &= ~NORTH + unres_sides &= ~SOUTH + + src.unres_sides = unres_sides + update_icon() + var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_exit), ) @@ -47,6 +60,10 @@ AddElement(/datum/element/connect_loc, loc_connections) RegisterSignal(src, COMSIG_COMPONENT_NTNET_RECEIVE, PROC_REF(ntnet_receive)) +/obj/machinery/door/window/ComponentInitialize() + . = ..() + AddComponent(/datum/component/ntnet_interface) + /obj/machinery/door/window/Destroy() set_density(FALSE) air_update_turf(1) @@ -343,7 +360,7 @@ // Cutting WIRE_IDSCAN grants remote access... or it would, if we could hack windowdoors. return id_scan_hacked() || ..() -/obj/machinery/door/window/proc/ntnet_receive(datum/source, datum/netdata/data) +/obj/machinery/door/window/proc/ntnet_receive(datum/netdata/data) // Check if the airlock is powered. if(!hasPower()) return @@ -352,10 +369,13 @@ if(is_jammed(JAMMER_PROTECTION_WIRELESS)) return + // Check packet access level. + if(!check_access_ntnet(data)) + return // Handle received packet. - var/command = data.data["data"] - var/command_value = data.data["data_secondary"] + var/command = lowertext(data.data["data"]) + var/command_value = lowertext(data.data["data_secondary"]) switch(command) if("open") if(command_value == "on" && !density) @@ -371,6 +391,20 @@ if("touch") INVOKE_ASYNC(src, PROC_REF(open_and_close)) +/obj/machinery/door/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + switch(the_rcd.mode) + if(RCD_DECONSTRUCT) + return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32) + return FALSE + +/obj/machinery/door/window/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + to_chat(user, "You deconstruct the windoor.") + qdel(src) + return TRUE + return FALSE + /obj/machinery/door/window/brigdoor name = "secure door" icon_state = "leftsecure" diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 797319285d1f1..53f649551a18e 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -29,14 +29,13 @@ RLD var/datum/effect_system/spark_spread/spark_system var/matter = 0 var/max_matter = 100 - var/sheetmultiplier = 4 //Controls the amount of matter added for each glass/iron sheet, triple for plasteel - var/plasteelmultiplier = 3 //Plasteel is worth 3 times more than glass or iron - var/plasmarglassmultiplier = 2 //50% less plasma than in plasteel - var/rglassmultiplier = 1.5 //One iron sheet, half a glass sheet var/no_ammo_message = "The \'Low Ammo\' light on the device blinks yellow." var/has_ammobar = FALSE //controls whether or not does update_icon apply ammo indicator overlays var/ammo_sections = 10 //amount of divisions in the ammo indicator overlay/number of ammo indicator states - var/upgrade = FALSE + /// Bitflags for upgrades + var/upgrade = NONE + /// Bitflags for banned upgrades + var/banned_upgrades = NONE var/datum/component/remote_materials/silo_mats //remote connection to the silo var/silo_link = FALSE //switch to use internal or remote storage @@ -62,58 +61,66 @@ RLD return ..() /obj/item/construction/attackby(obj/item/W, mob/user, params) - if(iscyborg(user)) + if(istype(W, /obj/item/rcd_upgrade)) + install_upgrade(W, user) + return TRUE + if(insert_matter(W, user)) + return TRUE + return ..() + +/// Installs an upgrade into the RCD checking if it is already installed, or if it is a banned upgrade +/obj/item/construction/proc/install_upgrade(obj/item/rcd_upgrade/rcd_up, mob/user) + if(rcd_up.upgrade & upgrade) + to_chat(user, "[src] has already installed this upgrade!") + return + if(rcd_up.upgrade & banned_upgrades) + to_chat(user, "[src] can't install this upgrade!") return - var/loaded = 0 - if(istype(W, /obj/item/rcd_ammo)) - var/obj/item/rcd_ammo/R = W + upgrade |= rcd_up.upgrade + if((rcd_up.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats) + silo_mats = AddComponent(/datum/component/remote_materials, "RCD", FALSE, FALSE) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + qdel(rcd_up) + +/// Inserts matter into the RCD allowing it to build +/obj/item/construction/proc/insert_matter(obj/O, mob/user) + if(iscyborg(user)) + return FALSE + var/loaded = FALSE + if(istype(O, /obj/item/rcd_ammo)) + var/obj/item/rcd_ammo/R = O var/load = min(R.ammoamt, max_matter - matter) if(load <= 0) to_chat(user, "[src] can't hold any more matter-units!") - return + return FALSE R.ammoamt -= load if(R.ammoamt <= 0) qdel(R) matter += load - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - loaded = 1 - else if(istype(W, /obj/item/stack/sheet/iron) || istype(W, /obj/item/stack/sheet/glass)) - loaded = loadwithsheets(W, sheetmultiplier, user) - else if(istype(W, /obj/item/stack/sheet/plasteel)) - loaded = loadwithsheets(W, plasteelmultiplier*sheetmultiplier, user) //12 matter for 1 plasteel sheet - else if(istype(W, /obj/item/stack/sheet/plasmarglass)) - loaded = loadwithsheets(W, plasmarglassmultiplier*sheetmultiplier, user) //8 matter for one plasma rglass sheet - else if(istype(W, /obj/item/stack/sheet/rglass)) - loaded = loadwithsheets(W, rglassmultiplier*sheetmultiplier, user) //6 matter for one rglass sheet - else if(istype(W, /obj/item/stack/rods)) - loaded = loadwithsheets(W, sheetmultiplier * 0.5, user) // 2 matter for 1 rod, as 2 rods are produced from 1 iron - else if(istype(W, /obj/item/stack/tile/plasteel)) - loaded = loadwithsheets(W, sheetmultiplier * 0.25, user) // 1 matter for 1 floortile, as 4 tiles are produced from 1 iron + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + loaded = TRUE + else if(istype(O, /obj/item/stack)) + loaded = loadwithsheets(O, user) if(loaded) to_chat(user, "[src] now holds [matter]/[max_matter] matter-units.") - else if(istype(W, /obj/item/rcd_upgrade)) - var/obj/item/rcd_upgrade/rcd_up = W - if(!(upgrade & rcd_up.upgrade)) - upgrade |= rcd_up.upgrade - if((rcd_up.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats) - silo_mats = AddComponent(/datum/component/remote_materials, "RCD", FALSE, FALSE) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - qdel(W) - else - return ..() - update_icon() //ensures that ammo counters (if present) get updated + update_appearance() //ensures that ammo counters (if present) get updated + return loaded -/obj/item/construction/proc/loadwithsheets(obj/item/stack/sheet/S, value, mob/user) +/obj/item/construction/proc/loadwithsheets(obj/item/stack/loaded_stack, mob/user) + var/value = loaded_stack.matter_amount + if(value <= 0) + to_chat(user, "You can't insert [loaded_stack.name] into [src]!") + return FALSE var/maxsheets = round((max_matter-matter)/value) //calculate the max number of sheets that will fit in RCD if(maxsheets > 0) - var/amount_to_use = min(S.amount, maxsheets) - S.use(amount_to_use) + var/amount_to_use = min(loaded_stack.amount, maxsheets) + loaded_stack.use(amount_to_use) matter += value*amount_to_use - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - to_chat(user, "You insert [amount_to_use] [S.name] sheets into [src]. ") - return 1 - to_chat(user, "You can't insert any more [S.name] sheets into [src]!") - return 0 + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + to_chat(user, "You insert [amount_to_use] [loaded_stack.name] sheets into [src]. ") + return TRUE + to_chat(user, "You can't insert any more [loaded_stack.name] sheets into [src]!") + return FALSE /obj/item/construction/proc/activate() playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) @@ -201,6 +208,11 @@ RLD var/airlock_type = /obj/machinery/door/airlock var/airlock_glass = FALSE // So the floor's rcd_act knows how much ammo to use var/window_type = /obj/structure/window/fulltile + var/window_glass = RCD_WINDOW_NORMAL + var/window_size = RCD_WINDOW_FULLTILE + var/furnish_type = /obj/structure/chair + var/furnish_cost = 8 + var/furnish_delay = 10 var/advanced_airlock_setting = 1 //Set to 1 if you want more paintjobs available var/delay_mod = 1 var/canRturf = FALSE //Variable for R walls to deconstruct them @@ -211,33 +223,63 @@ RLD user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..") return BRUTELOSS -/obj/item/construction/rcd/verb/toggle_window_type_verb() - set name = "RCD : Toggle Window Type" +/obj/item/construction/rcd/verb/toggle_window_glass_verb() + set name = "RCD : Toggle Window Glass" set category = "Object" set src in view(1) if(!usr.canUseTopic(src, BE_CLOSE)) return - toggle_window_type(usr) + toggle_window_glass(usr) + +/obj/item/construction/rcd/verb/toggle_window_size_verb() + set name = "RCD : Toggle Window Size" + set category = "Object" + set src in view(1) -/obj/item/construction/rcd/proc/toggle_window_type(mob/user) - var/window_type_name - if (window_type == /obj/structure/window/fulltile) - window_type = /obj/structure/window/reinforced/fulltile - window_type_name = "reinforced glass" + if(!usr.canUseTopic(src, BE_CLOSE)) + return + + toggle_window_size(usr) + +/// Toggles the usage of reinforced or normal glass +/obj/item/construction/rcd/proc/toggle_window_glass(mob/user) + if (window_glass != RCD_WINDOW_REINFORCED) + set_window_type(user, RCD_WINDOW_REINFORCED, window_size) + return + set_window_type(user, RCD_WINDOW_NORMAL, window_size) + +/// Toggles the usage of directional or full tile windows +/obj/item/construction/rcd/proc/toggle_window_size(mob/user) + if (window_size != RCD_WINDOW_DIRECTIONAL) + set_window_type(user, window_glass, RCD_WINDOW_DIRECTIONAL) + return + set_window_type(user, window_glass, RCD_WINDOW_FULLTILE) + +/// Sets the window type to be created based on parameters +/obj/item/construction/rcd/proc/set_window_type(mob/user, glass, size) + window_glass = glass + window_size = size + if(window_glass == RCD_WINDOW_REINFORCED) + if(window_size == RCD_WINDOW_DIRECTIONAL) + window_type = /obj/structure/window/reinforced + else + window_type = /obj/structure/window/reinforced/fulltile else - window_type = /obj/structure/window/fulltile - window_type_name = "glass" + if(window_size == RCD_WINDOW_DIRECTIONAL) + window_type = /obj/structure/window + else + window_type = /obj/structure/window/fulltile - to_chat(user, "You change \the [src]'s window mode to [window_type_name].") + to_chat(user, "You change \the [src]'s window mode to [window_size] [window_glass] window.") /obj/item/construction/rcd/proc/toggle_silo_link(mob/user) if(silo_mats) silo_link = !silo_link to_chat(user, "You change \the [src]'s storage link state: [silo_link ? "ON" : "OFF"].") else - to_chat(user, "\the [src] dont have remote storage connection.") + to_chat(user, "\the [src] doesn't have remote storage connection.") /obj/item/construction/rcd/proc/get_airlock_image(airlock_type) var/obj/machinery/door/airlock/proto = airlock_type @@ -276,7 +318,9 @@ RLD var/list/solid_or_glass_choices = list( "Solid" = get_airlock_image(/obj/machinery/door/airlock), - "Glass" = get_airlock_image(/obj/machinery/door/airlock/glass) + "Glass" = get_airlock_image(/obj/machinery/door/airlock/glass), + "Windoor" = image(icon = 'icons/mob/radial.dmi', icon_state = "windoor"), + "Secure Windoor" = image(icon = 'icons/mob/radial.dmi', icon_state = "secure_windoor") ) var/list/solid_choices = list( @@ -403,10 +447,47 @@ RLD else airlock_type = /obj/machinery/door/airlock/glass airlock_glass = TRUE + if("Windoor") + airlock_type = /obj/machinery/door/window + airlock_glass = TRUE + if("Secure Windoor") + airlock_type = /obj/machinery/door/window/brigdoor + airlock_glass = TRUE else airlock_type = /obj/machinery/door/airlock airlock_glass = FALSE +/// Radial menu for choosing the object you want to be created with the furnishing mode +/obj/item/construction/rcd/proc/change_furnishing_type(mob/user) + if(!user) + return + var/static/list/choices = list( + "Chair" = image(icon = 'icons/mob/radial.dmi', icon_state = "chair"), + "Stool" = image(icon = 'icons/mob/radial.dmi', icon_state = "stool"), + "Table" = image(icon = 'icons/mob/radial.dmi', icon_state = "table"), + "Glass Table" = image(icon = 'icons/mob/radial.dmi', icon_state = "glass_table") + ) + var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) + return + switch(choice) + if("Chair") + furnish_type = /obj/structure/chair + furnish_cost = 8 + furnish_delay = 10 + if("Stool") + furnish_type = /obj/structure/chair/stool + furnish_cost = 8 + furnish_delay = 10 + if("Table") + furnish_type = /obj/structure/table + furnish_cost = 16 + furnish_delay = 20 + if("Glass Table") + furnish_type = /obj/structure/table/glass + furnish_cost = 16 + furnish_delay = 20 + /obj/item/construction/rcd/proc/rcd_create(atom/A, mob/user) var/list/rcd_results = A.rcd_vals(user, src) if(!rcd_results) @@ -460,6 +541,10 @@ RLD choices += list( "Silo Link" = image(icon = 'icons/obj/mining.dmi', icon_state = "silo"), ) + if(upgrade & RCD_UPGRADE_FURNISHING) + choices += list( + "Furnishing" = image(icon = 'icons/mob/radial.dmi', icon_state = "chair") + ) if(mode == RCD_AIRLOCK) choices += list( "Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"), @@ -467,7 +552,12 @@ RLD ) else if(mode == RCD_WINDOWGRILLE) choices += list( - "Change Window Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "windowtype") + "Change Window Glass" = image(icon = 'icons/mob/radial.dmi', icon_state = "windowtype"), + "Change Window Size" = image(icon = 'icons/mob/radial.dmi', icon_state = "windowsize") + ) + else if(mode == RCD_FURNISHING) + choices += list( + "Change Furnishing Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "chair") ) var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) if(!check_menu(user)) @@ -483,6 +573,8 @@ RLD mode = RCD_WINDOWGRILLE if("Machine Frames") mode = RCD_MACHINE + if("Furnishing") + mode = RCD_FURNISHING if("Computer Frames") mode = RCD_COMPUTER change_computer_dir(user) @@ -495,15 +587,21 @@ RLD if("Change Airlock Type") change_airlock_setting(user) return - if("Change Window Type") - toggle_window_type(user) + if("Change Window Glass") + toggle_window_glass(user) + return + if("Change Window Size") + toggle_window_size(user) + return + if("Change Furnishing Type") + change_furnishing_type(user) return if("Silo Link") toggle_silo_link(user) return else return - playsound(src, 'sound/effects/pop.ogg', 50, 0) + playsound(src, 'sound/effects/pop.ogg', 50, FALSE) to_chat(user, "You change RCD's mode to '[choice]'.") /obj/item/construction/rcd/proc/target_check(atom/A, mob/user) // only returns true for stuff the device can actually work with @@ -543,6 +641,7 @@ RLD no_ammo_message = "Insufficient charge." desc = "A device used to rapidly build walls and floors." canRturf = TRUE + banned_upgrades = RCD_UPGRADE_SILO_LINK var/energyfactor = 72 @@ -804,14 +903,39 @@ RLD ///index, used in the attack self to get the type. stored here since it doesnt change var/list/choices = list() ///index, used in the attack self to get the type. stored here since it doesnt change + ///This list that holds all the plumbing design types the plumberer can construct. Its purpose is to make it easy to make new plumberer subtypes with a different selection of machines. + var/list/static/plumbing_design_types + var/list/name_to_type = list() /// var/list/machinery_data = list("cost" = list(), "delay" = list()) + +/obj/item/construction/plumbing/Initialize(mapload) + . = ..() + set_plumbing_designs() + + +///Set the list of designs this plumbing rcd can make +/obj/item/construction/plumbing/proc/set_plumbing_designs() + plumbing_design_types = list( + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/output = 5, + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/synthesizer = 15, + /obj/machinery/plumbing/reaction_chamber = 15, + //Above are the most common machinery which is shown on the first cycle. Keep new additions below THIS line, unless they're probably gonna be needed alot + /obj/machinery/plumbing/acclimator = 10, + /obj/machinery/plumbing/disposer = 10, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/grinder_chemical = 30, + /obj/machinery/plumbing/splitter = 5 +) + /obj/item/construction/plumbing/attack_self(mob/user) ..() if(!choices.len) - for(var/A in subtypesof(/obj/machinery/plumbing)) + for(var/A in plumbing_design_types) var/obj/machinery/plumbing/M = A if(initial(M.rcd_constructable)) choices += list(initial(M.name) = image(icon = initial(M.icon), icon_state = initial(M.icon_state))) @@ -883,6 +1007,10 @@ RLD desc = "It contains direct silo connection RCD upgrade." upgrade = RCD_UPGRADE_SILO_LINK +/obj/item/rcd_upgrade/furnishing + desc = "It contains the design for chairs, stools, tables, and glass tables." + upgrade = RCD_UPGRADE_FURNISHING + #undef GLOW_MODE #undef LIGHT_MODE #undef REMOVE_MODE diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index cfba60c4257d2..e770be8e55f69 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -158,7 +158,7 @@ matter = INFINITY delay_mod = 0.1 ranged = TRUE - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING canRturf = TRUE /obj/item/construction/rld/debug diff --git a/code/game/objects/items/stacks/rods/rods.dm b/code/game/objects/items/stacks/rods/rods.dm index 3376a344309fe..01fa00059e158 100644 --- a/code/game/objects/items/stacks/rods/rods.dm +++ b/code/game/objects/items/stacks/rods/rods.dm @@ -17,6 +17,7 @@ hitsound = 'sound/weapons/grenadelaunch.ogg' embedding = list() novariants = TRUE + matter_amount = 2 /obj/item/stack/rods/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to stuff \the [src] down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide!")//it looks like theyre ur mum diff --git a/code/game/objects/items/stacks/sheets/mineral/glass.dm b/code/game/objects/items/stacks/sheets/mineral/glass.dm index 7acb5fb24fc6d..e0ec416e94f6e 100644 --- a/code/game/objects/items/stacks/sheets/mineral/glass.dm +++ b/code/game/objects/items/stacks/sheets/mineral/glass.dm @@ -23,6 +23,7 @@ grind_results = list(/datum/reagent/silicon = 20) point_value = 1 tableVariant = /obj/structure/table/glass + matter_amount = 4 /obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -71,6 +72,7 @@ merge_type = /obj/item/stack/sheet/rglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) point_value = 4 + matter_amount = 6 /obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params) add_fingerprint(user) @@ -146,6 +148,7 @@ merge_type = /obj/item/stack/sheet/plasmarglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10) point_value = 23 + matter_amount = 8 /obj/item/stack/sheet/plasmarglass/get_recipes() return GLOB.prglass_recipes diff --git a/code/game/objects/items/stacks/sheets/mineral/metals.dm b/code/game/objects/items/stacks/sheets/mineral/metals.dm index 7bc99b44cf8f6..2d6e0fd0a32cf 100644 --- a/code/game/objects/items/stacks/sheets/mineral/metals.dm +++ b/code/game/objects/items/stacks/sheets/mineral/metals.dm @@ -28,6 +28,7 @@ Metals Sheets grind_results = list(/datum/reagent/iron = 20) point_value = 2 tableVariant = /obj/structure/table + matter_amount = 4 /obj/item/stack/sheet/iron/ratvar_act() new /obj/item/stack/sheet/brass(loc, amount) @@ -61,6 +62,7 @@ Metals Sheets grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) point_value = 23 tableVariant = /obj/structure/table/reinforced + matter_amount = 12 /obj/item/stack/sheet/plasteel/get_recipes() return GLOB.plasteel_recipes diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 177985ea11379..cffc364633b4e 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -38,6 +38,8 @@ var/novariants = TRUE ///Stores table variant to be built from this stack var/obj/structure/table/tableVariant + /// Amount of matter for RCD + var/matter_amount = 0 //NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - these amounts will be multiplied by the stack size in on_grind() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index a1fbf740b261b..cbf735da25f65 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -497,6 +497,7 @@ mineralType = "iron" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0) resistance_flags = FIRE_PROOF + matter_amount = 1 /obj/item/stack/tile/plasteel/cyborg desc = "The ground you walk on." //Not the usual floor tile desc as that refers to throwing, Cyborgs can't do that - RR diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 3adb0b8c64364..c9d44b53a3419 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -274,8 +274,13 @@ door.req_access = electronics.accesses if(created_name) door.name = created_name + else if(electronics.passed_name) + door.name = sanitize(electronics.passed_name) else door.name = base_name + if(electronics.passed_cycle_id) + door.closeOtherId = electronics.passed_cycle_id + door.update_other_id() door.previous_airlock = previous_assembly electronics.forceMove(door) door.update_icon() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index c1784d4cbf8ae..62411eaa38e91 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -53,10 +53,9 @@ if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) if(RCD_WINDOWGRILLE) - if(the_rcd.window_type == /obj/structure/window/reinforced/fulltile) + if(the_rcd.window_glass == RCD_WINDOW_REINFORCED) return list("mode" = RCD_WINDOWGRILLE, "delay" = 40, "cost" = 12) - else - return list("mode" = RCD_WINDOWGRILLE, "delay" = 20, "cost" = 8) + return list("mode" = RCD_WINDOWGRILLE, "delay" = 20, "cost" = 8) return FALSE /obj/structure/grille/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -69,17 +68,17 @@ if(RCD_WINDOWGRILLE) if(!isturf(loc)) return FALSE - var/turf/T = loc + var/turf/local_turf = loc if(!ispath(the_rcd.window_type, /obj/structure/window)) CRASH("Invalid window path type in RCD: [the_rcd.window_type]") var/obj/structure/window/window_path = the_rcd.window_type - if(!valid_window_location(T, user.dir, is_fulltile = initial(window_path.fulltile))) + if(!valid_window_location(local_turf, user.dir, is_fulltile = initial(window_path.fulltile))) to_chat(user, "Already a window in this direction!.") return FALSE to_chat(user, "You construct the window.") log_attack("[key_name(user)] has constructed a window at [loc_name(src)] using [format_text(initial(the_rcd.name))]") - var/obj/structure/window/WD = new the_rcd.window_type(T, user.dir) + var/obj/structure/window/WD = new the_rcd.window_type(local_turf, user.dir) WD.setAnchored(TRUE) return TRUE return FALSE diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 764c96ec104a0..81178075b39a2 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -248,6 +248,19 @@ new framestack(T, framestackamount) qdel(src) +/obj/structure/table/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + switch(the_rcd.mode) + if(RCD_DECONSTRUCT) + return list("mode" = RCD_DECONSTRUCT, "delay" = 24, "cost" = 16) + return FALSE + +/obj/structure/table/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + to_chat(user, "You deconstruct the table.") + qdel(src) + return TRUE + return FALSE /* * Glass tables diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index fc31a345300e7..942a0514a1ad7 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -203,6 +203,8 @@ return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25) if(RCD_COMPUTER) return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25) + if(RCD_FURNISHING) + return list("mode" = RCD_FURNISHING, "delay" = the_rcd.furnish_delay, "cost" = the_rcd.furnish_cost) return FALSE /turf/open/floor/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -217,28 +219,47 @@ return TRUE if(RCD_LADDER) to_chat(user, "You build a ladder.") - var/obj/structure/ladder/L = new(src) - L.anchored = TRUE + var/obj/structure/ladder/Ladder = new(src) + Ladder.anchored = TRUE return TRUE if(RCD_AIRLOCK) - if(locate(/obj/machinery/door/airlock) in src) + if(locate(/obj/machinery/door) in src) return FALSE + if(ispath(the_rcd.airlock_type, /obj/machinery/door/window)) + to_chat(user, "You build a windoor.") + var/obj/machinery/door/window/new_window = new the_rcd.airlock_type(src, user.dir, the_rcd.airlock_electronics?.unres_sides) + if(the_rcd.airlock_electronics) + new_window.name = the_rcd.airlock_electronics.passed_name || initial(new_window.name) + if(the_rcd.airlock_electronics.one_access) + new_window.req_one_access = the_rcd.airlock_electronics.accesses.Copy() + else + new_window.req_access = the_rcd.airlock_electronics.accesses.Copy() + new_window.autoclose = TRUE + new_window.update_icon() + return TRUE to_chat(user, "You build an airlock.") log_attack("[key_name(user)] has constructed an airlock at [loc_name(src)] using [format_text(initial(the_rcd.name))]") - var/obj/machinery/door/airlock/A = new the_rcd.airlock_type(src) - A.electronics = new /obj/item/electronics/airlock(A) + var/obj/machinery/door/airlock/new_airlock = new the_rcd.airlock_type(src) + new_airlock.electronics = new /obj/item/electronics/airlock(new_airlock) if(the_rcd.airlock_electronics) - A.electronics.accesses = the_rcd.airlock_electronics.accesses.Copy() - A.electronics.one_access = the_rcd.airlock_electronics.one_access - A.electronics.unres_sides = the_rcd.airlock_electronics.unres_sides - if(A.electronics.one_access) - A.req_one_access = A.electronics.accesses + new_airlock.electronics.accesses = the_rcd.airlock_electronics.accesses.Copy() + new_airlock.electronics.one_access = the_rcd.airlock_electronics.one_access + new_airlock.electronics.unres_sides = the_rcd.airlock_electronics.unres_sides + new_airlock.electronics.passed_name = the_rcd.airlock_electronics.passed_name + new_airlock.electronics.passed_cycle_id = the_rcd.airlock_electronics.passed_cycle_id + if(new_airlock.electronics.one_access) + new_airlock.req_one_access = new_airlock.electronics.accesses else - A.req_access = A.electronics.accesses - if(A.electronics.unres_sides) - A.unres_sides = A.electronics.unres_sides - A.autoclose = TRUE - A.update_icon() + new_airlock.req_access = new_airlock.electronics.accesses + if(new_airlock.electronics.unres_sides) + new_airlock.unres_sides = new_airlock.electronics.unres_sides + if(new_airlock.electronics.passed_name) + new_airlock.name = new_airlock.electronics.passed_name + if(new_airlock.electronics.passed_cycle_id) + new_airlock.closeOtherId = new_airlock.electronics.passed_cycle_id + new_airlock.update_other_id() + new_airlock.autoclose = TRUE + new_airlock.update_icon() return TRUE if(RCD_DECONSTRUCT) var/previous_turf = initial(name) @@ -252,24 +273,30 @@ return FALSE to_chat(user, "You construct the grille.") log_attack("[key_name(user)] has constructed a grille at [loc_name(src)] using [format_text(initial(the_rcd.name))]") - var/obj/structure/grille/G = new(src) - G.anchored = TRUE + var/obj/structure/grille/new_grille = new(src) + new_grille.anchored = TRUE return TRUE if(RCD_MACHINE) if(locate(/obj/structure/frame/machine) in src) return FALSE - var/obj/structure/frame/machine/M = new(src) - M.state = 2 - M.icon_state = "box_1" - M.anchored = TRUE + var/obj/structure/frame/machine/new_machine = new(src) + new_machine.state = 2 + new_machine.icon_state = "box_1" + new_machine.anchored = TRUE return TRUE if(RCD_COMPUTER) if(locate(/obj/structure/frame/computer) in src) return FALSE - var/obj/structure/frame/computer/C = new(src) - C.anchored = TRUE - C.state = 1 - C.setDir(the_rcd.computer_dir) + var/obj/structure/frame/computer/new_computer = new(src) + new_computer.anchored = TRUE + new_computer.state = 1 + new_computer.setDir(the_rcd.computer_dir) + return TRUE + if(RCD_FURNISHING) + if(locate(the_rcd.furnish_type) in src) + return FALSE + var/atom/new_furnish = new the_rcd.furnish_type(src) + new_furnish.setDir(user.dir) return TRUE return FALSE diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index c5de462d03f9c..186904ea06743 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -210,13 +210,13 @@ /datum/action/innate/aux_base/window_type - name = "Select Window Type" + name = "Select Window Glass" button_icon_state = "window_select" /datum/action/innate/aux_base/window_type/Activate() if(..()) return - B.RCD.toggle_window_type() + B.RCD.toggle_window_glass() /datum/action/innate/aux_base/place_fan name = "Place Tiny Fan" diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index d1bfe256eac84..d0493343f4b5b 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -93,6 +93,16 @@ category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/rcd_upgrade/furnishing + name = "RCD furnishing upgrade" + desc = "Adds the ability to furnish areas using the RCD." + id = "rcd_upgrade_furnishing" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 2500, /datum/material/silver = 1500, /datum/material/titanium = 2000) + build_path = /obj/item/rcd_upgrade/furnishing + category = list("Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + /datum/design/rcd_upgrade/silo_link name = "Advanced RCD silo link upgrade" desc = "Upgrades the RCD to be able to pull materials from the ore silo. The RCD must be linked to the silo using a multitool before it will function." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index a06697ad9488b..ce4d036d2df97 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1575,8 +1575,9 @@ description = "Unlocks new designs that improve rapid devices." design_ids = list( "rcd_upgrade_frames", + "rcd_upgrade_furnishing", "rcd_upgrade_simple_circuits", - "rpd_upgrade_unwrench", + "rpd_upgrade_unwrench" ) prereq_ids = list("adv_engi") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi index d0c94f15ad86c4f18e689f133e19caedb062eed8..cd9bfad2001c31b58b11ec4a6c5c42faf0dfa0ed 100644 GIT binary patch literal 20778 zcmaHSbyQT*_b=TrAT2S3gaT3$QUg*dElPJIEgjC#oq~ikC?Gwwbc1v=tfcFMoO17TXpB&x29Nk>8u>5kqW@x$P2vH79j+V;*{x$!t_oL_VkGJpt zP6grr`Npp9Q=4)h?gIL}R9hAB`tK0=R8rP;9#m{K-5l5@E1Lm;=f_H%h2#pHjNYDi z!p2tzEPvg+qiqX8+D0F0L`%(l^56CzGFoPH-YbE5AN8FX(6+4~rYsx+Hk*98@h@l< z#lOH++zzLHEfqO`)1EQsP_!&$wTt>u>-L#{fSRr^!V$eTU-IA<-6hXcRXm1@Kym!Wl)bYf?8Qf99)>5Azl$Li5$!vfTL& zmxFe2vi|&3M)(;fqyKPAh0|FpdTG{u9xu4*I&d8w+Ksw~Pr{Y6o}aS7&=pu%nip@B z6yE#g9On||(9SR2=eN` zCLp>#V`uZHbd4w(A-hC7@@X$20$xtE<@QJ+5N)^9E+5z3Y$m6Z$00;rm?x{Y7-;E? zy1K5$JhL!5PpMT-dK z0|r?V7(+HE_-Y2YT&W@FD=>fOwdm(KFc@raokfz(0i`6_Z6%l@^Cd9&;M0{GB#Tn| zD*JdFvi)d4%S56m4lCgAXW=xf+D&lHG4*CtZ0kSvHo{@SD%V*l6~GymfVSDXuYG$S zvA+E`X7EetrY0X<@H1Ej@y9>z8A5)+l??Igz>~F@p%lVBZ1o^YldHYywc13l#cJ6Y zYg!*}zE?$eajw4>Pm%ih?L!|>N*}2S0NNGLC%bVgA1!W2If_Rn6FT5f=QlN_qdb;i zFe{(f024jE2~)pn4*6=Bez?{pddz58F#9SwAcrG7qs=n^wM*{?_Mq%9`|YlZDeAd1 zk{g$;);ylqtOdjfIlHF5h`a(O+RHIHs~-_LZu=#XIK5;`vhvfYI8w{6Eo;uE58WEi z`soKb6z~Ic>=Cz4|Fz?$3p~C^=(nDx{*FoP;iOnnyf_d(Was{D(FdZ8p*`2h*GH~lu zu8Sy@kT;e&)dv--ala%#!V0QmtQb&>HX@P3h|O`fF-{{DXkxS=lz}&|_jU zEdoS>Lj0_3=NLbP^`VI@TkLlMswaRc9Fg!hkwTOcmfitIvp$<{m4r4Nd-g3h7gz&J zCjIH=1Qmq+pwc|H|J{Pu1k>BI2g|*21rYYsnFk@+dr}#Lsc1k=54HNKAKsTU3e^>5 zBDSJsCVq6Eb<|&xv3)AeOl;LC$Tkre&8c8gr}ZQx7aXJz@0mW1+fQdoBjOsan(-1l z3yC;1$}8~8OSk`ztSU7Jf4`=bi0WnMb(Wmz+w%i=Dn2Gr&1BCe9FF}Jcgiq5D{|wRPy_h79OGl{vBrqeBN} z2F)HisvXr~YP{zpHS-Xr(R)T5ezy=3|703SJRdY?xT=T5&QBQK80 zsK9+cgsHnLB05X`UgyHmt{v<3I4~N1czO`XMuvVKy&$15B@V9Xt2hY}s%41bcm-7c z6uIE{f%RLBpvf@O)S{xQTm9%?xfG``DlQLe&_29SN}j|2qV?mH`uL`zIDnEWB6b|B zZy_scxLskIbnaKlj!!x66J~ZF*pJ&mcMfBg0@f|Esmf}~#mmQX{pSMn*j7~Y6@q

i`GJ0SVNgmSIP%7?NM{nzo1sZWKH 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 diff --git a/tgui/packages/tgui/interfaces/AirlockElectronics.js b/tgui/packages/tgui/interfaces/AirlockElectronics.js index 8eb0de72828d0..04125188360f4 100644 --- a/tgui/packages/tgui/interfaces/AirlockElectronics.js +++ b/tgui/packages/tgui/interfaces/AirlockElectronics.js @@ -1,11 +1,11 @@ import { useBackend } from '../backend'; -import { Button, LabeledList, Section } from '../components'; +import { Button, LabeledList, Input, Section } from '../components'; import { Window } from '../layouts'; import { AccessList } from './common/AccessList'; export const AirlockElectronics = (props, context) => { const { act, data } = useBackend(context); - const { oneAccess, unres_direction } = data; + const { oneAccess, unres_direction, passedName, passedCycleId } = data; const regions = data.regions || []; const accesses = data.accesses || []; return ( @@ -62,6 +62,30 @@ export const AirlockElectronics = (props, context) => { } /> + + + act('passedName', { + passedName: value, + }) + } + /> + + + + act('passedCycleId', { + passedCycleId: value, + }) + } + /> +