/obj/machinery/portable_atmospherics/powered/pump name = "portable air pump" icon = 'icons/obj/atmos.dmi' icon_state = "psiphon:0" density = TRUE w_class = ITEMSIZE_NORMAL var/on = 0 var/direction_out = 0 //0 = siphoning, 1 = releasing var/target_pressure = ONE_ATMOSPHERE var/pressuremin = 0 var/pressuremax = 10 * ONE_ATMOSPHERE volume = 1000 power_rating = 7500 //7500 W ~ 10 HP power_losses = 150 /obj/machinery/portable_atmospherics/powered/pump/filled start_pressure = 90 * ONE_ATMOSPHERE /obj/machinery/portable_atmospherics/powered/pump/Initialize(mapload, skip_cell) . = ..() if(!skip_cell) cell = new/obj/item/cell/apc(src) var/list/air_mix = StandardAirMix() src.air_contents.adjust_multi(GAS_O2, air_mix[GAS_O2], GAS_N2, air_mix[GAS_N2]) AddElement(/datum/element/climbable) /obj/machinery/portable_atmospherics/powered/pump/update_icon() cut_overlays() if(on && cell && cell.charge) icon_state = "psiphon:1" else icon_state = "psiphon:0" if(holding) add_overlay("siphon-open") if(connected_port) add_overlay("siphon-connector") return /obj/machinery/portable_atmospherics/powered/pump/emp_act(severity, recursive) if(stat & (BROKEN|NOPOWER)) ..(severity, recursive) return if(prob(50/severity)) on = !on if(prob(100/severity)) direction_out = !direction_out target_pressure = rand(0,1300) update_icon() ..(severity, recursive) /obj/machinery/portable_atmospherics/powered/pump/process() ..() var/power_draw = -1 if(on && cell && cell.charge) var/datum/gas_mixture/environment if(holding) environment = holding.air_contents else environment = loc.return_air() var/pressure_delta var/output_volume var/air_temperature if(direction_out) pressure_delta = target_pressure - environment.return_pressure() output_volume = environment.volume * environment.group_multiplier air_temperature = environment.temperature? environment.temperature : air_contents.temperature else pressure_delta = environment.return_pressure() - target_pressure output_volume = air_contents.volume * air_contents.group_multiplier air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) if (pressure_delta > 0.01) if (direction_out) power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) else power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) if (power_draw < 0) last_flow_rate = 0 last_power_draw = 0 else power_draw = max(power_draw, power_losses) cell.use(power_draw * CELLRATE) last_power_draw = power_draw update_connected_network() //ran out of charge if (!cell.charge) power_change() update_icon() src.updateDialog() /obj/machinery/portable_atmospherics/powered/pump/return_air() return air_contents /obj/machinery/portable_atmospherics/powered/pump/attack_ai(var/mob/user) src.add_hiddenprint(user) return src.attack_hand(user) /obj/machinery/portable_atmospherics/powered/pump/attack_ghost(var/mob/user) return src.attack_hand(user) /obj/machinery/portable_atmospherics/powered/pump/attack_hand(var/mob/user) tgui_interact(user) /obj/machinery/portable_atmospherics/powered/pump/tgui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "PortablePump", name) ui.open() /obj/machinery/portable_atmospherics/powered/pump/tgui_state(mob/user) return GLOB.tgui_physical_state /obj/machinery/portable_atmospherics/powered/pump/tgui_data(mob/user) var/list/data[0] data["on"] = on ? TRUE : FALSE data["direction"] = !direction_out ? TRUE : FALSE data["connected"] = connected_port ? TRUE : FALSE data["pressure"] = round(air_contents.return_pressure() > 0 ? air_contents.return_pressure() : 0) data["target_pressure"] = round(target_pressure ? target_pressure : 0) data["default_pressure"] = round(initial(target_pressure)) data["min_pressure"] = round(pressuremin) data["max_pressure"] = round(pressuremax) data["powerDraw"] = round(last_power_draw) data["cellCharge"] = cell ? cell.charge : 0 data["cellMaxCharge"] = cell ? cell.maxcharge : 1 if(holding) data["holding"] = list() data["holding"]["name"] = holding.name data["holding"]["pressure"] = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0) else data["holding"] = null return data /obj/machinery/portable_atmospherics/powered/pump/tgui_act(action, params) if(..()) return TRUE switch(action) if("power") on = !on . = 1 if("direction") direction_out = !direction_out . = 1 if("eject") if(holding) holding.loc = loc holding = null . = 1 if("pressure") var/pressure = params["pressure"] if(pressure == "reset") pressure = initial(target_pressure) . = TRUE else if(pressure == "min") pressure = pressuremin . = TRUE else if(pressure == "max") pressure = pressuremax . = TRUE else if(text2num(pressure) != null) pressure = text2num(pressure) . = TRUE if(.) target_pressure = clamp(round(pressure), pressuremin, pressuremax) update_icon()