/* 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/binary/pump name = "gas pump" desc = "A pump." desc_info = "This moves gas from one pipe to another. A higher target pressure demands more energy. The side with the red end is the output." icon = 'icons/atmos/pump.dmi' icon_state = "map_off" level = 1 var/target_pressure = ONE_ATMOSPHERE //var/max_volume_transfer = 10000 use_power = 0 idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 7500 //7500 W ~ 10 HP var/max_pressure_setting = 15000 //kPa var/frequency = 0 var/id = null var/datum/radio_frequency/radio_connection var/broadcast_status_next_process = FALSE /obj/machinery/atmospherics/binary/pump/Initialize() . = ..() air1.volume = ATMOS_DEFAULT_VOLUME_PUMP air2.volume = ATMOS_DEFAULT_VOLUME_PUMP /obj/machinery/atmospherics/binary/pump/on icon_state = "map_on" use_power = 1 /obj/machinery/atmospherics/binary/pump/update_icon() if(!powered()) icon_state = "off" else icon_state = "[use_power ? "on" : "off"]" /obj/machinery/atmospherics/binary/pump/update_underlays() if(..()) underlays.Cut() var/turf/T = get_turf(src) if(!istype(T)) return add_underlay(T, node1, turn(dir, -180)) add_underlay(T, node2, dir) /obj/machinery/atmospherics/binary/pump/hide(var/i) update_underlays() /obj/machinery/atmospherics/binary/pump/machinery_process() last_power_draw = 0 last_flow_rate = 0 if((stat & (NOPOWER|BROKEN)) || !use_power) return if (broadcast_status_next_process) broadcast_status() broadcast_status_next_process = FALSE var/power_draw = -1 var/pressure_delta = target_pressure - air2.return_pressure() if(pressure_delta > 0.01 && air1.temperature > 0) //Figure out how much gas to transfer to meet the target pressure. var/transfer_moles = calculate_transfer_moles(air1, air2, pressure_delta, (network2)? network2.volume : 0) power_draw = pump_gas(src, air1, air2, transfer_moles, power_rating) if (power_draw >= 0) last_power_draw = power_draw use_power(power_draw) if(network1) network1.update = 1 if(network2) network2.update = 1 return 1 //Radio remote control /obj/machinery/atmospherics/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/binary/pump/proc/broadcast_status() if(!radio_connection) return 0 var/datum/signal/signal = new signal.transmission_method = TRANSMISSION_RADIO signal.source = src signal.data = list( "tag" = id, "device" = "AGP", "power" = use_power, "target_output" = target_pressure, "sigtype" = "status" ) radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) return 1 /obj/machinery/atmospherics/binary/pump/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(stat & (BROKEN|NOPOWER)) return // this is the data which will be sent to the ui var/data[0] data = list( "on" = use_power, "pressure_set" = round(target_pressure*100), //Nano UI can't handle rounded non-integers, apparently. "max_pressure" = max_pressure_setting, "last_flow_rate" = round(last_flow_rate*10), "last_power_draw" = round(last_power_draw), "max_power_draw" = power_rating ) // update the ui if it exists, returns null if no ui is passed/found ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm ui = new(user, src, ui_key, "gas_pump.tmpl", name, 470, 290) ui.set_initial_data(data) // when the ui is first opened this is the data it will use ui.open() // open the new ui window ui.set_auto_update(1) // auto update every Master Controller tick /obj/machinery/atmospherics/binary/pump/atmos_init() ..() if(frequency) set_frequency(frequency) /obj/machinery/atmospherics/binary/pump/receive_signal(datum/signal/signal) if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) return 0 if(signal.data["power"]) if(text2num(signal.data["power"])) use_power = 1 else use_power = 0 if("power_toggle" in signal.data) use_power = !use_power if(signal.data["set_output_pressure"]) target_pressure = between( 0, text2num(signal.data["set_output_pressure"]), ONE_ATMOSPHERE*50 ) if(signal.data["status"]) broadcast_status_next_process = TRUE return //do not update_icon broadcast_status_next_process = TRUE update_icon() /obj/machinery/atmospherics/binary/pump/attack_hand(user as mob) if(..()) return src.add_fingerprint(usr) if(!src.allowed(user)) to_chat(user, "Access denied.") return usr.set_machine(src) ui_interact(user) return /obj/machinery/atmospherics/binary/pump/Topic(href,href_list) if(..()) return 1 if(href_list["power"]) use_power = !use_power switch(href_list["set_press"]) if ("min") target_pressure = 0 if ("max") target_pressure = max_pressure_setting if ("set") var/new_pressure = input(usr,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure control",src.target_pressure) as num src.target_pressure = between(0, new_pressure, max_pressure_setting) usr.set_machine(src) src.add_fingerprint(usr) src.update_icon() /obj/machinery/atmospherics/binary/pump/power_change() var/old_stat = stat ..() if(old_stat != stat) update_icon() /obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/W as obj, var/mob/user as mob) if (!W.iswrench() && !istype(W, /obj/item/pipewrench)) return ..() if (!(stat & NOPOWER) && use_power) to_chat(user, "You cannot unwrench this [src], turn it off first.") return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE && !istype(W, /obj/item/pipewrench)) to_chat(user, "You cannot unwrench this [src], it's too exerted due to internal pressure.") add_fingerprint(user) return 1 else to_chat(user, "You struggle to unwrench \the [src] with your pipe wrench.") playsound(src.loc, W.usesound, 50, 1) to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, istype(W, /obj/item/pipewrench) ? 80/W.toolspeed : 40/W.toolspeed, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src)