From 949cdd275bd1d35bce81bbd9a97eb18a90dedef0 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 4 Aug 2014 20:55:45 -0400 Subject: [PATCH] Updates portable pumps and scrubbers --- .../atmoalter/area_atmos_computer.dm | 24 +- .../atmoalter/portable_atmospherics.dm | 36 +++ code/game/machinery/atmoalter/pump.dm | 110 ++++---- code/game/machinery/atmoalter/scrubber.dm | 253 ++++++++++-------- maps/tgstation2.dmm | 52 ++-- 5 files changed, 285 insertions(+), 190 deletions(-) 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 += {" - - + + "} 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: - - -
[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 +