diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 0a12db9704..c66df872c4 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -19,6 +19,7 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list( new /datum/pipe_info/pipe("Manifold", /obj/machinery/atmospherics/pipe/manifold), new /datum/pipe_info/pipe("Manual Valve", /obj/machinery/atmospherics/components/binary/valve), new /datum/pipe_info/pipe("Digital Valve", /obj/machinery/atmospherics/components/binary/valve/digital), + new /datum/pipe_info/pipe("Relief Valve", /obj/machinery/atmospherics/components/binary/relief_valve), new /datum/pipe_info/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/manifold4w), new /datum/pipe_info/pipe("Layer Manifold", /obj/machinery/atmospherics/pipe/layer_manifold), ), diff --git a/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm new file mode 100644 index 0000000000..ffe0099f23 --- /dev/null +++ b/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm @@ -0,0 +1,108 @@ +/obj/machinery/atmospherics/components/binary/relief_valve + name = "binary pressure relief valve" + desc = "Like a manual valve, but opens at a certain pressure rather than being toggleable." + icon = 'icons/obj/atmospherics/components/relief_valve.dmi' + icon_state = "relief_valve-t-map" + can_unwrench = TRUE + construction_type = /obj/item/pipe/binary + var/opened = FALSE + var/open_pressure = ONE_ATMOSPHERE * 3 + var/close_pressure = ONE_ATMOSPHERE + pipe_state = "relief_valve-t" + +/obj/machinery/atmospherics/components/binary/relief_valve/layer1 + piping_layer = PIPING_LAYER_MIN + pixel_x = -PIPING_LAYER_P_X + pixel_y = -PIPING_LAYER_P_Y + +/obj/machinery/atmospherics/components/binary/relief_valve/layer3 + piping_layer = PIPING_LAYER_MAX + pixel_x = PIPING_LAYER_P_X + pixel_y = PIPING_LAYER_P_Y + +/obj/machinery/atmospherics/components/binary/relief_valve/update_icon_nopipes() + if(dir==SOUTH) + setDir(NORTH) + else if(dir==WEST) + setDir(EAST) + cut_overlays() + + if(!nodes[1] || !opened || !is_operational()) + icon_state = "relief_valve-t" + return + + icon_state = "relief_valve-t-blown" + +/obj/machinery/atmospherics/components/binary/relief_valve/proc/open() + opened = TRUE + update_icon_nopipes() + update_parents() + var/datum/pipeline/parent1 = parents[1] + parent1.reconcile_air() + +/obj/machinery/atmospherics/components/binary/relief_valve/proc/close() + opened = FALSE + update_icon_nopipes() + +/obj/machinery/atmospherics/components/binary/relief_valve/process_atmos() + ..() + + if(!is_operational()) + return + + var/datum/gas_mixture/air_contents = airs[1] + var/our_pressure = air_contents.return_pressure() + if(opened && our_pressure < close_pressure) + close() + else if(!opened && our_pressure >= open_pressure) + open() + +/obj/machinery/atmospherics/components/binary/relief_valve/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "atmos_relief", name, 335, 115, master_ui, state) + ui.open() + +/obj/machinery/atmospherics/components/binary/relief_valve/ui_data() + var/data = list() + data["open_pressure"] = round(open_pressure) + data["close_pressure"] = round(close_pressure) + data["max_pressure"] = round(MAX_OUTPUT_PRESSURE) + return data + +/obj/machinery/atmospherics/components/binary/relief_valve/ui_act(action, params) + if(..()) + return + switch(action) + if("open_pressure") + var/pressure = params["open_pressure"] + if(pressure == "max") + pressure = MAX_OUTPUT_PRESSURE + . = TRUE + else if(pressure == "input") + pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, open_pressure) as num|null + if(!isnull(pressure) && !..()) + . = TRUE + else if(text2num(pressure) != null) + pressure = text2num(pressure) + . = TRUE + if(.) + open_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) + investigate_log("open pressure was set to [open_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) + if("close_pressure") + var/pressure = params["close_pressure"] + if(pressure == "max") + pressure = MAX_OUTPUT_PRESSURE + . = TRUE + else if(pressure == "input") + pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, close_pressure) as num|null + if(!isnull(pressure) && !..()) + . = TRUE + else if(text2num(pressure) != null) + pressure = text2num(pressure) + . = TRUE + if(.) + close_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) + investigate_log("close pressure was set to [close_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) + update_icon() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm index 4191247b9d..3a443b8887 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm @@ -2,7 +2,7 @@ name = "pressure relief valve" desc = "A valve that opens to the air at a certain pressure, then closes once it goes below another." icon = 'icons/obj/atmospherics/components/relief_valve.dmi' - icon_state = "relief_valve-e" + icon_state = "relief_valve-e-map" can_unwrench = TRUE var/opened = FALSE var/open_pressure = ONE_ATMOSPHERE * 3 diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index db8a8e90ad..899b621262 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -227,6 +227,11 @@ if(V.on) PL |= V.parents[1] PL |= V.parents[2] + else if (istype(atmosmch,/obj/machinery/atmospherics/components/binary/relief_valve)) + var/obj/machinery/atmospherics/components/binary/relief_valve/V = atmosmch + if(V.opened) + PL |= V.parents[1] + PL |= V.parents[2] else if (istype(atmosmch, /obj/machinery/atmospherics/components/unary/portables_connector)) var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch if(C.connected_device) diff --git a/icons/obj/atmospherics/components/relief_valve.dmi b/icons/obj/atmospherics/components/relief_valve.dmi index b2277a9004..2ed56f6183 100644 Binary files a/icons/obj/atmospherics/components/relief_valve.dmi and b/icons/obj/atmospherics/components/relief_valve.dmi differ diff --git a/icons/obj/atmospherics/pipes/pipe_item.dmi b/icons/obj/atmospherics/pipes/pipe_item.dmi index 2c92e0e767..76e3e687c5 100644 Binary files a/icons/obj/atmospherics/pipes/pipe_item.dmi and b/icons/obj/atmospherics/pipes/pipe_item.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 1964550aa9..96b23be941 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1467,6 +1467,7 @@ #include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\relief_valve.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm"