Files
CHOMPStation2/code/game/machinery/atmoalter/scrubber.dm
PsiOmega ba240cb768 Merge remote-tracking branch 'upstream/dev-freeze' into dev
Conflicts:
	code/game/antagonist/station/rogue_ai.dm
	code/game/machinery/atmoalter/portable_atmospherics.dm
	code/game/machinery/spaceheater.dm
	code/modules/clothing/head/soft_caps.dm
	maps/exodus-5.dmm
2015-08-12 21:18:18 +02:00

240 lines
6.4 KiB
Plaintext

/obj/machinery/portable_atmospherics/powered/scrubber
name = "Portable Air Scrubber"
icon = 'icons/obj/atmos.dmi'
icon_state = "pscrubber:0"
density = 1
var/on = 0
var/volume_rate = 800
volume = 750
power_rating = 7500 //7500 W ~ 10 HP
power_losses = 150
var/minrate = 0
var/maxrate = 10 * ONE_ATMOSPHERE
var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent", "oxygen_agent_b")
/obj/machinery/portable_atmospherics/powered/scrubber/New()
..()
cell = new/obj/item/weapon/cell/apc(src)
/obj/machinery/portable_atmospherics/powered/scrubber/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
return
if(prob(50/severity))
on = !on
update_icon()
..(severity)
/obj/machinery/portable_atmospherics/powered/scrubber/update_icon()
src.overlays = 0
if(on && cell && cell.charge)
icon_state = "pscrubber:1"
else
icon_state = "pscrubber:0"
if(holding)
overlays += "scrubber-open"
if(connected_port)
overlays += "scrubber-connector"
return
/obj/machinery/portable_atmospherics/powered/scrubber/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/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles
power_draw = scrub_gas(src, scrubbing_gas, 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.update_icon()
src.updateDialog()
/obj/machinery/portable_atmospherics/powered/scrubber/return_air()
return air_contents
/obj/machinery/portable_atmospherics/powered/scrubber/attack_ai(var/mob/user)
src.add_hiddenprint(user)
return src.attack_hand(user)
/obj/machinery/portable_atmospherics/powered/scrubber/attack_ghost(var/mob/user)
return src.attack_hand(user)
/obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(var/mob/user)
ui_interact(user)
return
/obj/machinery/portable_atmospherics/powered/scrubber/ui_interact(mob/user, ui_key = "rcon", datum/nanoui/ui=null, force_open=1)
var/list/data[0]
data["portConnected"] = connected_port ? 1 : 0
data["tankPressure"] = round(air_contents.return_pressure() > 0 ? air_contents.return_pressure() : 0)
data["rate"] = round(volume_rate)
data["minrate"] = round(minrate)
data["maxrate"] = round(maxrate)
data["powerDraw"] = round(last_power_draw)
data["cellCharge"] = cell ? cell.charge : 0
data["cellMaxCharge"] = cell ? cell.maxcharge : 1
data["on"] = on ? 1 : 0
data["hasHoldingTank"] = holding ? 1 : 0
if (holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0))
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "portscrubber.tmpl", "Portable Scrubber", 480, 400, state = physical_state)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/portable_atmospherics/powered/scrubber/Topic(href, href_list)
if(..())
return 1
if(href_list["power"])
on = !on
. = 1
if (href_list["remove_tank"])
if(holding)
holding.loc = loc
holding = null
. = 1
if (href_list["volume_adj"])
var/diff = text2num(href_list["volume_adj"])
volume_rate = Clamp(volume_rate+diff, minrate, maxrate)
. = 1
update_icon()
//Huge scrubber
/obj/machinery/portable_atmospherics/powered/scrubber/huge
name = "Huge Air Scrubber"
icon_state = "scrubber:0"
anchored = 1
volume = 50000
volume_rate = 5000
use_power = 1
idle_power_usage = 500 //internal circuitry, friction losses and stuff
active_power_usage = 100000 //100 kW ~ 135 HP
var/global/gid = 1
var/id = 0
/obj/machinery/portable_atmospherics/powered/scrubber/huge/New()
..()
cell = null
id = gid
gid++
name = "[name] (ID [id])"
/obj/machinery/portable_atmospherics/powered/scrubber/huge/attack_hand(var/mob/user as mob)
usr << "<span class='notice'>You can't directly interact with this machine. Use the scrubber control console.</span>"
/obj/machinery/portable_atmospherics/powered/scrubber/huge/update_icon()
src.overlays = 0
if(on && !(stat & (NOPOWER|BROKEN)))
icon_state = "scrubber:1"
else
icon_state = "scrubber:0"
/obj/machinery/portable_atmospherics/powered/scrubber/huge/power_change()
var/old_stat = stat
..()
if (old_stat != stat)
update_icon()
/obj/machinery/portable_atmospherics/powered/scrubber/huge/process()
if(!on || (stat & (NOPOWER|BROKEN)))
update_use_power(0)
last_flow_rate = 0
last_power_draw = 0
return 0
var/power_draw = -1
var/datum/gas_mixture/environment = loc.return_air()
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles
power_draw = scrub_gas(src, scrubbing_gas, environment, air_contents, transfer_moles, active_power_usage)
if (power_draw < 0)
last_flow_rate = 0
last_power_draw = 0
else
use_power(power_draw)
update_connected_network()
/obj/machinery/portable_atmospherics/powered/scrubber/huge/attackby(var/obj/item/I as obj, var/mob/user as mob)
if(istype(I, /obj/item/weapon/wrench))
if(on)
user << "<span class='warning'>Turn \the [src] off first!</span>"
return
anchored = !anchored
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>"
return
//doesn't use power cells
if(istype(I, /obj/item/weapon/cell))
return
if (istype(I, /obj/item/weapon/screwdriver))
return
//doesn't hold tanks
if(istype(I, /obj/item/weapon/tank))
return
..()
/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary
name = "Stationary Air Scrubber"
/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary/attackby(var/obj/item/I as obj, var/mob/user as mob)
if(istype(I, /obj/item/weapon/wrench))
user << "<span class='warning'>The bolts are too tight for you to unscrew!</span>"
return
..()