/* Every cycle, the pump uses the air in air_in to try and make air_out the perfect pressure. node1, air1, network1 correspond to input node2, air2, network2 correspond to output Thus, the two variables affect pump operation are set in New(): air1.volume This is the volume of gas available to the pump that may be transfered to the output air2.volume Higher quantities of this cause more air to be perfected later but overall network volume is also increased as this increases... */ /obj/machinery/atmospherics/components/binary/pump icon_state = "pump_map" name = "gas pump" desc = "A pump that moves gas by pressure." can_unwrench = TRUE var/target_pressure = ONE_ATMOSPHERE var/frequency = 0 var/id = null var/datum/radio_frequency/radio_connection construction_type = /obj/item/pipe/directional pipe_state = "pump" /obj/machinery/atmospherics/components/binary/pump/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X pixel_y = -PIPING_LAYER_P_Y /obj/machinery/atmospherics/components/binary/pump/layer3 piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y /obj/machinery/atmospherics/components/binary/pump/on on = TRUE icon_state = "pump_on_map" /obj/machinery/atmospherics/components/binary/pump/on/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X pixel_y = -PIPING_LAYER_P_Y /obj/machinery/atmospherics/components/binary/pump/on/layer3 piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y /obj/machinery/atmospherics/components/binary/pump/Destroy() SSradio.remove_object(src,frequency) if(radio_connection) radio_connection = null return ..() /obj/machinery/atmospherics/components/binary/pump/update_icon_nopipes() if(!is_operational()) icon_state = "pump_off" return icon_state = "pump_[on?"on":"off"]" /obj/machinery/atmospherics/components/binary/pump/process_atmos() // ..() if(!on || !is_operational()) return var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] var/output_starting_pressure = air2.return_pressure() if((target_pressure - output_starting_pressure) < 0.01) //No need to pump gas if target is already reached! return //Calculate necessary moles to transfer using PV=nRT if((air1.total_moles() > 0) && (air1.temperature>0)) var/pressure_delta = target_pressure - output_starting_pressure var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) //Actually transfer the gas var/datum/gas_mixture/removed = air1.remove(transfer_moles) air2.merge(removed) update_parents() //Radio remote control /obj/machinery/atmospherics/components/binary/pump/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA) /obj/machinery/atmospherics/components/binary/pump/proc/broadcast_status() if(!radio_connection) return var/datum/signal/signal = new(list( "tag" = id, "device" = "AGP", "power" = on, "target_output" = target_pressure, "sigtype" = "status" )) radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) /obj/machinery/atmospherics/components/binary/pump/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_pump", name, 335, 115, master_ui, state) ui.open() /obj/machinery/atmospherics/components/binary/pump/ui_data() var/data = list() data["on"] = on data["pressure"] = round(target_pressure) data["max_pressure"] = round(MAX_OUTPUT_PRESSURE) return data /obj/machinery/atmospherics/components/binary/pump/ui_act(action, params) if(..()) return var/turf/T = get_turf(src) var/area/A = get_area(src) switch(action) if("power") on = !on message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE if("pressure") var/pressure = params["pressure"] if(pressure == "max") pressure = MAX_OUTPUT_PRESSURE . = TRUE else if(pressure == "input") pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null if(!isnull(pressure) && !..()) . = TRUE else if(text2num(pressure) != null) pressure = text2num(pressure) . = TRUE if(.) target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() /obj/machinery/atmospherics/components/binary/pump/atmosinit() ..() if(frequency) set_frequency(frequency) /obj/machinery/atmospherics/components/binary/pump/receive_signal(datum/signal/signal) if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) return var/old_on = on //for logging if("power" in signal.data) on = text2num(signal.data["power"]) if("power_toggle" in signal.data) on = !on if("set_output_pressure" in signal.data) target_pressure = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) if("status" in signal.data) broadcast_status() return broadcast_status() update_icon() /obj/machinery/atmospherics/components/binary/pump/power_change() ..() update_icon() /obj/machinery/atmospherics/components/binary/pump/can_unwrench(mob/user) . = ..() var/area/A = get_area(src) if(. && on && is_operational()) to_chat(user, "You cannot unwrench [src], turn it off first!") return FALSE else investigate_log("Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) message_admins("Pump, [src.name], was unwrenched by [ADMIN_LOOKUPFLW(user)] at [A]") return TRUE