mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-09 16:12:17 +00:00
196 lines
5.1 KiB
Plaintext
196 lines
5.1 KiB
Plaintext
/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()
|