/* 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 icon = 'icons/atmos/pump.dmi' icon_state = "map_off" construction_type = /obj/item/pipe/directional pipe_state = "pump" level = 1 var/base_icon = "pump" name = "gas pump" desc = "A pump that moves gas from one place to another." var/target_pressure = ONE_ATMOSPHERE //var/max_volume_transfer = 10000 use_power = USE_POWER_OFF 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 = ZERO_FREQ var/id = null var/datum/radio_frequency/radio_connection /obj/machinery/atmospherics/binary/pump/Initialize(mapload) . = ..() air1.volume = ATMOS_DEFAULT_VOLUME_PUMP air2.volume = ATMOS_DEFAULT_VOLUME_PUMP if(frequency) set_frequency(frequency) /obj/machinery/atmospherics/binary/pump/Destroy() unregister_radio(src, frequency) . = ..() /obj/machinery/atmospherics/binary/pump/on icon_state = "map_on" use_power = USE_POWER_IDLE /obj/machinery/atmospherics/binary/pump/fuel icon_state = "map_off-fuel" base_icon = "pump-fuel" icon_connect_type = "-fuel" connect_types = CONNECT_TYPE_FUEL /obj/machinery/atmospherics/binary/pump/fuel/on icon_state = "map_on-fuel" use_power = USE_POWER_IDLE /obj/machinery/atmospherics/binary/pump/aux icon_state = "map_off-aux" base_icon = "pump-aux" icon_connect_type = "-aux" connect_types = CONNECT_TYPE_AUX /obj/machinery/atmospherics/binary/pump/aux/on icon_state = "map_on-aux" use_power = USE_POWER_IDLE /obj/machinery/atmospherics/binary/pump/update_icon() if(!powered()) icon_state = "[base_icon]-off" else icon_state = "[use_power ? "[base_icon]-on" : "[base_icon]-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), node1?.icon_connect_type) add_underlay(T, node2, dir, node2?.icon_connect_type) /obj/machinery/atmospherics/binary/pump/hide(var/i) update_underlays() /obj/machinery/atmospherics/binary/pump/process() last_power_draw = 0 last_flow_rate = 0 if((stat & (NOPOWER|BROKEN)) || !use_power) return 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, radio_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 //radio signal 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, radio_filter = RADIO_ATMOSIA) return 1 /obj/machinery/atmospherics/binary/pump/tgui_interact(mob/user, datum/tgui/ui) if(stat & (BROKEN|NOPOWER)) return ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "GasPump", name) ui.open() /obj/machinery/atmospherics/binary/pump/tgui_data(mob/user) // 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, ) return data /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"])) update_use_power(USE_POWER_IDLE) else update_use_power(USE_POWER_OFF) if("power_toggle" in signal.data) update_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"]) spawn(2) broadcast_status() return //do not update_icon spawn(2) broadcast_status() update_icon() return /obj/machinery/atmospherics/binary/pump/attack_ghost(mob/user) tgui_interact(user) /obj/machinery/atmospherics/binary/pump/attack_hand(mob/user) if(..()) return add_fingerprint(user) if(!allowed(user)) to_chat(user, span_warning("Access denied.")) return tgui_interact(user) /obj/machinery/atmospherics/binary/pump/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE switch(action) if("power") update_use_power(!use_power) . = TRUE if("set_press") var/press = params["press"] switch(press) if("min") target_pressure = 0 if("max") target_pressure = max_pressure_setting if("set") var/new_pressure = tgui_input_number(ui.user,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure control",src.target_pressure,max_pressure_setting,0) src.target_pressure = between(0, new_pressure, max_pressure_setting) . = TRUE add_fingerprint(ui.user) 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.has_tool_quality(TOOL_WRENCH)) return ..() if (!(stat & NOPOWER) && use_power) to_chat(user, span_warning("You cannot unwrench this [src], turn it off first.")) return 1 if(!can_unwrench()) to_chat(user, span_warning("You cannot unwrench this [src], it too exerted due to internal pressure.")) add_fingerprint(user) return 1 playsound(src, W.usesound, 50, 1) to_chat(user, span_notice("You begin to unfasten \the [src]...")) if (do_after(user, 40 * W.toolspeed, target = src)) user.visible_message( \ span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \ span_notice("You have unfastened \the [src]."), \ "You hear ratchet.") deconstruct() //CHOMPEdit Start - Adds TGStation keybinds to save our engineers some time. /obj/machinery/atmospherics/binary/pump/click_alt(mob/user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(allowed(user)) to_chat(user, span_notice("You set the [name] to max output")) target_pressure = max_pressure_setting add_fingerprint(user) else to_chat(user, span_warning("Access denied.")) /obj/machinery/atmospherics/binary/pump/click_ctrl(mob/user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(allowed(user)) update_use_power(!use_power) update_icon() add_fingerprint(user) if(use_power) to_chat(user, span_notice("You toggle the [name] on.")) else to_chat(user, span_notice("You toggle the [name] off.")) else to_chat(user, span_warning("Access denied.")) //CHOMPEdit End /obj/machinery/atmospherics/binary/pump/high_power icon = 'icons/atmos/volume_pump.dmi' icon_state = "map_off" construction_type = /obj/item/pipe/directional pipe_state = "volumepump" level = 1 name = "high power gas pump" desc = "A pump that moves gas from one place to another. Has double the power rating of the standard gas pump." power_rating = 15000 //15000 W ~ 20 HP /obj/machinery/atmospherics/binary/pump/high_power/on use_power = USE_POWER_IDLE icon_state = "map_on" /obj/machinery/atmospherics/binary/pump/high_power/update_icon() if(!powered()) icon_state = "off" else icon_state = "[use_power ? "on" : "off"]"