diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index ac7af07435..20347eefe6 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -71,11 +71,19 @@
[status]
Scan
"}
- for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in connectedscrubbers)
+ for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in connectedscrubbers)
dat += {"
- | [scrubber.name] |
- Turn On Turn Off |
+
+ [scrubber.name]
+ Pressure: [round(scrubber.air_contents.return_pressure(), 0.01)] kPa
+ Flow Rate: [round(scrubber.last_flow_rate,0.1)] L/s
+ |
+
+ Turn On
+ Turn Off
+ Load: [round(scrubber.last_power_draw)] W
+ |
"}
dat += {"
@@ -96,7 +104,7 @@
if(href_list["scan"])
scanscrubbers()
else if(href_list["toggle"])
- var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber = locate(href_list["scrub"])
+ var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber = locate(href_list["scrub"])
if(!validscrubber(scrubber))
spawn(20)
@@ -108,7 +116,7 @@
scrubber.on = text2num(href_list["toggle"])
scrubber.update_icon()
- proc/validscrubber( var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj )
+ proc/validscrubber( var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber as obj )
if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z)
return 0
@@ -118,7 +126,7 @@
connectedscrubbers = new()
var/found = 0
- for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in range(range, src.loc))
+ for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in range(range, src.loc))
if(istype(scrubber))
found = 1
connectedscrubbers += scrubber
@@ -132,7 +140,7 @@
/obj/machinery/computer/area_atmos/area
zone = "This computer is working in a wired network limited to this area."
- validscrubber( var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj )
+ validscrubber( var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber as obj )
if(!isobj(scrubber))
return 0
@@ -166,7 +174,7 @@
var/area/A = T.loc
if (A.master)
A = A.master
- for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in world )
+ for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in world )
var/turf/T2 = get_turf(scrubber)
if(T2 && T2.loc)
var/area/A2 = T2.loc
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 8fbbece0b2..8fbb27a351 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -133,3 +133,39 @@
return
return
+
+
+
+/obj/machinery/portable_atmospherics/powered
+ var/power_rating
+ var/power_losses
+ var/last_power_draw = 0
+ var/obj/item/weapon/cell/cell
+
+/obj/machinery/portable_atmospherics/powered/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/cell))
+ if(cell)
+ user << "There is already a power cell installed."
+ return
+
+ var/obj/item/weapon/cell/C = I
+
+ user.drop_item()
+ C.add_fingerprint(user)
+ cell = C
+ C.loc = src
+ user.visible_message("\blue [user] opens the panel on [src] and inserts [C].", "\blue You open the panel on [src] and insert [C].")
+ return
+
+ if(istype(I, /obj/item/weapon/screwdriver))
+ if(!cell)
+ user << "\red There is no power cell installed."
+ return
+
+ user.visible_message("\blue [user] opens the panel on [src] and removes [cell].", "\blue You open the panel on [src] and remove [cell].")
+ cell.add_fingerprint(user)
+ cell.loc = src.loc
+ cell = null
+ return
+
+ ..()
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 00aedd9363..abf0b9e8de 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -1,5 +1,5 @@
-/obj/machinery/portable_atmospherics/pump
- name = "Portable Air Pump"
+/obj/machinery/portable_atmospherics/powered/pump
+ name = "portable air pump"
icon = 'icons/obj/atmos.dmi'
icon_state = "psiphon:0"
@@ -10,11 +10,18 @@
var/target_pressure = 100
volume = 1000
+
+ power_rating = 7500 //7500 W ~ 10 HP
+ power_losses = 150
-/obj/machinery/portable_atmospherics/pump/update_icon()
+/obj/machinery/portable_atmospherics/powered/pump/New()
+ ..()
+ cell = new/obj/item/weapon/cell(src)
+
+/obj/machinery/portable_atmospherics/powered/pump/update_icon()
src.overlays = 0
- if(on)
+ if(on && cell && cell.charge)
icon_state = "psiphon:1"
else
icon_state = "psiphon:0"
@@ -27,7 +34,7 @@
return
-/obj/machinery/portable_atmospherics/pump/emp_act(severity)
+/obj/machinery/portable_atmospherics/powered/pump/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
return
@@ -43,76 +50,79 @@
..(severity)
-/obj/machinery/portable_atmospherics/pump/process()
+/obj/machinery/portable_atmospherics/powered/pump/process()
..()
- if(on)
+ 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)
- var/pressure_delta = target_pressure - environment.return_pressure()
- //Can not have a pressure delta that would cause environment pressure > tank pressure
-
- var/transfer_moles = 0
- if(air_contents.temperature > 0)
- transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
-
- //Actually transfer the gas
- var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
-
- if(holding)
- environment.merge(removed)
- else
- loc.assume_air(removed)
+ pressure_delta = target_pressure - environment.return_pressure()
+ output_volume = environment.volume * environment.group_multiplier
+ air_temperature = environment.temperature? environment.temperature : air_contents.temperature
else
- var/pressure_delta = target_pressure - air_contents.return_pressure()
- //Can not have a pressure delta that would cause environment pressure > tank pressure
-
- var/transfer_moles = 0
- if(environment.temperature > 0)
- transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION)
-
- //Actually transfer the gas
- var/datum/gas_mixture/removed
- if(holding)
- removed = environment.remove(transfer_moles)
- else
- removed = loc.remove_air(transfer_moles)
-
- air_contents.merge(removed)
- //src.update_icon()
-
+ pressure_delta = target_pressure - air_contents.return_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
+
+ //ran out of charge
+ if (!cell.charge)
+ update_icon()
+
src.updateDialog()
- return
-/obj/machinery/portable_atmospherics/pump/return_air()
+/obj/machinery/portable_atmospherics/powered/pump/return_air()
return air_contents
-/obj/machinery/portable_atmospherics/pump/attack_ai(var/mob/user as mob)
+/obj/machinery/portable_atmospherics/powered/pump/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/portable_atmospherics/pump/attack_paw(var/mob/user as mob)
+/obj/machinery/portable_atmospherics/powered/pump/attack_paw(var/mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/portable_atmospherics/pump/attack_hand(var/mob/user as mob)
+/obj/machinery/portable_atmospherics/powered/pump/attack_hand(var/mob/user as mob)
user.set_machine(src)
var/holding_text
if(holding)
- holding_text = {"
Tank Pressure: [holding.air_contents.return_pressure()] KPa
-Remove Tank
+ holding_text = {"
Tank Pressure: [round(holding.air_contents.return_pressure(), 0.01)] kPa
+Remove Tank
"}
- var/output_text = {"[name]
-Pressure: [air_contents.return_pressure()] KPa
+ var/output_text = {"[capitalize(name)]
+Pressure: [round(air_contents.return_pressure(), 0.01)] kPa
+Flow Rate: [round(last_flow_rate, 0.1)] L/s
Port Status: [(connected_port)?("Connected"):("Disconnected")]
-[holding_text]
+[holding_text]
+Cell Charge: [cell? "[round(cell.percent())]%" : "N/A"] | Load: [round(last_power_draw)] W
Power Switch: [on?("On"):("Off")]
Pump Direction: [direction_out?("Out"):("In")]
-Target Pressure: - - - - [target_pressure] + + + +
+Target Pressure: - - - - [target_pressure] kPa+ + + +
Close
"}
@@ -122,7 +132,7 @@ Target Pressure: - Tank Pressure: [holding.air_contents.return_pressure()] KPa
-Remove Tank
+ holding_text = {"
Tank Pressure: [round(holding.air_contents.return_pressure(), 0.01)] kPa
+Remove Tank
"}
var/output_text = {"[name]
-Pressure: [air_contents.return_pressure()] KPa
+Pressure: [round(air_contents.return_pressure(), 0.01)] kPa
+Flow Rate: [round(last_flow_rate, 0.1)] L/s
Port Status: [(connected_port)?("Connected"):("Disconnected")]
-[holding_text]
+[holding_text]
+Cell Charge: [cell? "[round(cell.percent())]%" : "N/A"] | Load: [round(last_power_draw)] W
Power Switch: [on?("On"):("Off")]
-Power regulator: - - - - [volume_rate] + + + +
+Flow Rate Regulator: - - - - [volume_rate] L/s + + + +
Close
@@ -171,7 +113,7 @@ Power regulator: - - -