Activity logging for pumps.

relative pathing to absolute pathing
This commit is contained in:
Chris
2014-12-02 00:50:13 -06:00
parent 7b2ed687f6
commit a0ee2a5384
4 changed files with 534 additions and 528 deletions

View File

@@ -1,4 +1,4 @@
obj/machinery/atmospherics/binary /obj/machinery/atmospherics/binary
dir = SOUTH dir = SOUTH
initialize_directions = SOUTH|NORTH initialize_directions = SOUTH|NORTH
use_power = 1 use_power = 1
@@ -11,125 +11,126 @@ obj/machinery/atmospherics/binary
var/datum/pipe_network/network1 var/datum/pipe_network/network1
var/datum/pipe_network/network2 var/datum/pipe_network/network2
var/list/activity_log = list()
New() /obj/machinery/atmospherics/binary/New()
..() ..()
switch(dir) switch(dir)
if(NORTH) if(NORTH)
initialize_directions = NORTH|SOUTH initialize_directions = NORTH|SOUTH
if(SOUTH) if(SOUTH)
initialize_directions = NORTH|SOUTH initialize_directions = NORTH|SOUTH
if(EAST) if(EAST)
initialize_directions = EAST|WEST initialize_directions = EAST|WEST
if(WEST) if(WEST)
initialize_directions = EAST|WEST initialize_directions = EAST|WEST
air1 = new air1 = new
air2 = new air2 = new
air1.volume = 200 air1.volume = 200
air2.volume = 200 air2.volume = 200
buildFrom(var/mob/usr,var/obj/item/pipe/pipe) /obj/machinery/atmospherics/binary/buildFrom(var/mob/usr,var/obj/item/pipe/pipe)
dir = pipe.dir dir = pipe.dir
initialize_directions = pipe.get_pipe_dir() initialize_directions = pipe.get_pipe_dir()
if (pipe.pipename) if (pipe.pipename)
name = pipe.pipename name = pipe.pipename
var/turf/T = loc var/turf/T = loc
level = T.intact ? 2 : 1 level = T.intact ? 2 : 1
initialize() initialize()
build_network() build_network()
if (node1) if (node1)
node1.initialize() node1.initialize()
node1.build_network() node1.build_network()
if (node2) if (node2)
node2.initialize() node2.initialize()
node2.build_network() node2.build_network()
return 1 return 1
// Housekeeping and pipe network stuff below // Housekeeping and pipe network stuff below
network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) /obj/machinery/atmospherics/binary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
if(reference == node1) if(reference == node1)
network1 = new_network network1 = new_network
else if(reference == node2) else if(reference == node2)
network2 = new_network network2 = new_network
if(new_network.normal_members.Find(src)) if(new_network.normal_members.Find(src))
return 0 return 0
new_network.normal_members += src new_network.normal_members += src
return null return null
Destroy() /obj/machinery/atmospherics/binary/Destroy()
if(node1) if(node1)
node1.disconnect(src) node1.disconnect(src)
del(network1) del(network1)
if(node2) if(node2)
node2.disconnect(src) node2.disconnect(src)
del(network2) del(network2)
node1 = null
node2 = null
..()
/obj/machinery/atmospherics/binary/initialize()
if(node1 && node2) return
node1 = findConnecting(turn(dir, 180))
node2 = findConnecting(dir)
update_icon()
/obj/machinery/atmospherics/binary/build_network()
if(!network1 && node1)
network1 = new /datum/pipe_network()
network1.normal_members += src
network1.build_network(node1, src)
if(!network2 && node2)
network2 = new /datum/pipe_network()
network2.normal_members += src
network2.build_network(node2, src)
/obj/machinery/atmospherics/binary/return_network(obj/machinery/atmospherics/reference)
build_network()
if(reference==node1)
return network1
if(reference==node2)
return network2
return null
/obj/machinery/atmospherics/binary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
if(network1 == old_network)
network1 = new_network
if(network2 == old_network)
network2 = new_network
return 1
/obj/machinery/atmospherics/binary/return_network_air(datum/pipe_network/reference)
var/list/results = list()
if(network1 == reference)
results += air1
if(network2 == reference)
results += air2
return results
/obj/machinery/atmospherics/binary/disconnect(obj/machinery/atmospherics/reference)
if(reference==node1)
del(network1)
node1 = null node1 = null
else if(reference==node2)
del(network2)
node2 = null node2 = null
..() return null
initialize()
if(node1 && node2) return
node1 = findConnecting(turn(dir, 180))
node2 = findConnecting(dir)
update_icon()
build_network()
if(!network1 && node1)
network1 = new /datum/pipe_network()
network1.normal_members += src
network1.build_network(node1, src)
if(!network2 && node2)
network2 = new /datum/pipe_network()
network2.normal_members += src
network2.build_network(node2, src)
return_network(obj/machinery/atmospherics/reference)
build_network()
if(reference==node1)
return network1
if(reference==node2)
return network2
return null
reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
if(network1 == old_network)
network1 = new_network
if(network2 == old_network)
network2 = new_network
return 1
return_network_air(datum/pipe_network/reference)
var/list/results = list()
if(network1 == reference)
results += air1
if(network2 == reference)
results += air2
return results
disconnect(obj/machinery/atmospherics/reference)
if(reference==node1)
del(network1)
node1 = null
else if(reference==node2)
del(network2)
node2 = null
return null

View File

@@ -1,4 +1,4 @@
obj/machinery/atmospherics/binary/passive_gate /obj/machinery/atmospherics/binary/passive_gate
//Tries to achieve target pressure at output (like a normal pump) except //Tries to achieve target pressure at output (like a normal pump) except
// Uses no power but can not transfer gases from a low pressure area to a high pressure area // Uses no power but can not transfer gases from a low pressure area to a high pressure area
icon = 'icons/obj/atmospherics/passive_gate.dmi' icon = 'icons/obj/atmospherics/passive_gate.dmi'
@@ -14,175 +14,177 @@ obj/machinery/atmospherics/binary/passive_gate
var/id_tag = null var/id_tag = null
var/datum/radio_frequency/radio_connection var/datum/radio_frequency/radio_connection
update_icon() /obj/machinery/atmospherics/binary/passive_gate/update_icon()
if(stat & NOPOWER) if(stat & NOPOWER)
icon_state = "intact_off" icon_state = "intact_off"
else if(node1 && node2) else if(node1 && node2)
icon_state = "intact_[on?("on"):("off")]" icon_state = "intact_[on?("on"):("off")]"
else
if(node1)
icon_state = "exposed_1_off"
else if(node2)
icon_state = "exposed_2_off"
else else
if(node1) icon_state = "exposed_3_off"
icon_state = "exposed_1_off" return
else if(node2)
icon_state = "exposed_2_off"
else
icon_state = "exposed_3_off"
return
process() /obj/machinery/atmospherics/binary/passive_gate/process()
..() ..()
if(!on) if(!on)
return 0 return 0
var/output_starting_pressure = air2.return_pressure() var/output_starting_pressure = air2.return_pressure()
var/input_starting_pressure = air1.return_pressure() var/input_starting_pressure = air1.return_pressure()
if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10))
//No need to pump gas if target is already reached or input pressure is too low //No need to pump gas if target is already reached or input pressure is too low
//Need at least 10 KPa difference to overcome friction in the mechanism //Need at least 10 KPa difference to overcome friction in the mechanism
return 1 return 1
//Calculate necessary moles to transfer using PV = nRT //Calculate necessary moles to transfer using PV = nRT
if((air1.total_moles() > 0) && (air1.temperature>0)) if((air1.total_moles() > 0) && (air1.temperature>0))
var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2)
//Can not have a pressure delta that would cause output_pressure > input_pressure //Can not have a pressure delta that would cause output_pressure > input_pressure
var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas //Actually transfer the gas
var/datum/gas_mixture/removed = air1.remove(transfer_moles) var/datum/gas_mixture/removed = air1.remove(transfer_moles)
air2.merge(removed) air2.merge(removed)
if(network1) if(network1)
network1.update = 1 network1.update = 1
if(network2) if(network2)
network2.update = 1 network2.update = 1
//Radio remote control //Radio remote control
proc
set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA)
broadcast_status() /obj/machinery/atmospherics/binary/passive_gate/proc/set_frequency(new_frequency)
if(!radio_connection) radio_controller.remove_object(src, frequency)
return 0 frequency = new_frequency
if(frequency)
radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA)
var/datum/signal/signal = new /obj/machinery/atmospherics/binary/passive_gate/proc/broadcast_status()
signal.transmission_method = 1 //radio signal if(!radio_connection)
signal.source = src return 0
signal.data = list( var/datum/signal/signal = new
"tag" = id_tag, signal.transmission_method = 1 //radio signal
"device" = "AGP", signal.source = src
"power" = on,
"target_output" = target_pressure,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) signal.data = list(
"tag" = id_tag,
"device" = "AGP",
"power" = on,
"target_output" = target_pressure,
"sigtype" = "status"
)
return 1 radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
interact(mob/user as mob) return 1
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
<b>Desirable output pressure: </b>
[round(target_pressure,0.1)]kPa | <a href='?src=\ref[src];set_press=1'>Change</a>
"}
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_pump") /obj/machinery/atmospherics/binary/passive_gate/interact(mob/user as mob)
onclose(user, "atmo_pump") var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
<b>Desirable output pressure: </b>
[round(target_pressure,0.1)]kPa | <a href='?src=\ref[src];set_press=1'>Change</a>
"}
initialize() user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_pump")
..() onclose(user, "atmo_pump")
if(frequency)
set_frequency(frequency)
receive_signal(datum/signal/signal) /obj/machinery/atmospherics/binary/passive_gate/initialize()
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) ..()
return 0 if(frequency)
set_frequency(frequency)
if("power" in signal.data) /obj/machinery/atmospherics/binary/passive_gate/receive_signal(datum/signal/signal)
on = text2num(signal.data["power"]) if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0
if("power_toggle" in signal.data) if("power" in signal.data)
on = !on on = text2num(signal.data["power"])
if("set_output_pressure" in signal.data) if("power_toggle" in signal.data)
target_pressure = between( on = !on
0,
text2num(signal.data["set_output_pressure"]),
ONE_ATMOSPHERE*50
)
if("status" in signal.data) if("set_output_pressure" in signal.data)
spawn(2) target_pressure = between(
broadcast_status() 0,
return //do not update_icon text2num(signal.data["set_output_pressure"]),
ONE_ATMOSPHERE*50
)
if("status" in signal.data)
spawn(2) spawn(2)
broadcast_status() broadcast_status()
update_icon() return //do not update_icon
spawn(2)
broadcast_status()
update_icon()
activity_log += text("\[[time_stamp()]\] Remote signal powered us [on ? "on" : "off"]")
return
/obj/machinery/atmospherics/binary/passive_gate/attack_hand(user as mob)
if(..())
return return
src.add_fingerprint(usr)
if(!src.allowed(user))
user << "\red Access denied."
attack_hand(user as mob)
if(..())
return
src.add_fingerprint(usr)
if(!src.allowed(user))
user << "\red Access denied."
return
usr.set_machine(src)
interact(user)
return return
usr.set_machine(src)
interact(user)
return
Topic(href,href_list) /obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list)
if(..()) return if(..()) return
if(href_list["power"]) if(href_list["power"])
on = !on on = !on
if(href_list["set_press"]) activity_log += text("\[[time_stamp()]\] Real name: [], Key: [] - turned [] \the [].",usr.real_name, usr.key,(on ? "on" : "off"),src)
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num if(href_list["set_press"])
src.target_pressure = max(0, min(4500, new_pressure)) var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
usr.set_machine(src) src.target_pressure = max(0, min(4500, new_pressure))
src.update_icon() usr.set_machine(src)
src.updateUsrDialog() src.update_icon()
return src.updateUsrDialog()
return
power_change() /obj/machinery/atmospherics/binary/passive_gate/power_change()
..() ..()
update_icon() update_icon()
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) /obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench)) if (!istype(W, /obj/item/weapon/wrench))
return ..() return ..()
if (on) if (on)
user << "\red You cannot unwrench this [src], turn it off first." user << "\red You cannot unwrench this [src], turn it off first."
return 1 return 1
var/turf/T = src.loc var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact) if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first." user << "\red You must remove the plating first."
return 1 return 1
var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air() var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..." user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40)) if (do_after(user, 40))
user.visible_message( \ user.visible_message( \
"[user] unfastens \the [src].", \ "[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \ "\blue You have unfastened \the [src].", \
"You hear ratchet.") "You hear ratchet.")
new /obj/item/pipe(loc, make_from=src) new /obj/item/pipe(loc, make_from=src)
del(src) del(src)

View File

@@ -12,7 +12,7 @@ Thus, the two variables affect pump operation are set in New():
but overall network volume is also increased as this increases... but overall network volume is also increased as this increases...
*/ */
obj/machinery/atmospherics/binary/pump /obj/machinery/atmospherics/binary/pump
icon = 'icons/obj/atmospherics/pump.dmi' icon = 'icons/obj/atmospherics/pump.dmi'
icon_state = "intact_off" icon_state = "intact_off"
@@ -26,180 +26,182 @@ obj/machinery/atmospherics/binary/pump
var/id_tag = null var/id_tag = null
var/datum/radio_frequency/radio_connection var/datum/radio_frequency/radio_connection
highcap /obj/machinery/atmospherics/binary/pump/highcap
name = "High capacity gas pump" name = "High capacity gas pump"
desc = "A high capacity pump" desc = "A high capacity pump"
target_pressure = 15000000 target_pressure = 15000000
on /obj/machinery/atmospherics/binary/pump/on
on = 1 on = 1
icon_state = "intact_on" icon_state = "intact_on"
update_icon() /obj/machinery/atmospherics/binary/pump/update_icon()
if(stat & NOPOWER) if(stat & NOPOWER)
icon_state = "intact_off" icon_state = "intact_off"
else if(node1 && node2) else if(node1 && node2)
icon_state = "intact_[on?("on"):("off")]" icon_state = "intact_[on?("on"):("off")]"
else
if(node1)
icon_state = "exposed_1_off"
else if(node2)
icon_state = "exposed_2_off"
else else
if(node1) icon_state = "exposed_3_off"
icon_state = "exposed_1_off" return
else if(node2)
icon_state = "exposed_2_off"
else
icon_state = "exposed_3_off"
return
process() /obj/machinery/atmospherics/binary/pump/process()
// ..() // ..()
if(stat & (NOPOWER|BROKEN)) if(stat & (NOPOWER|BROKEN))
return return
if(!on) if(!on)
return 0 return 0
var/output_starting_pressure = air2.return_pressure() var/output_starting_pressure = air2.return_pressure()
if( (target_pressure - output_starting_pressure) < 0.01)
//No need to pump gas if target is already reached!
return 1
//Calculate necessary moles to transfer using PV=nRT
if((air1.total_moles() > 0) && (air1.temperature>0))
var/pressure_delta = target_pressure - output_starting_pressure
var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
air2.merge(removed)
if(network1)
network1.update = 1
if(network2)
network2.update = 1
if( (target_pressure - output_starting_pressure) < 0.01)
//No need to pump gas if target is already reached!
return 1 return 1
//Radio remote control //Calculate necessary moles to transfer using PV=nRT
if((air1.total_moles() > 0) && (air1.temperature>0))
var/pressure_delta = target_pressure - output_starting_pressure
var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
proc //Actually transfer the gas
set_frequency(new_frequency) var/datum/gas_mixture/removed = air1.remove(transfer_moles)
radio_controller.remove_object(src, frequency) air2.merge(removed)
frequency = new_frequency
if(frequency)
radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA)
broadcast_status() if(network1)
if(!radio_connection) network1.update = 1
return 0
var/datum/signal/signal = new if(network2)
signal.transmission_method = 1 //radio signal network2.update = 1
signal.source = src
signal.data = list( return 1
"tag" = id_tag,
"device" = "AGP",
"power" = on,
"target_output" = target_pressure,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) //Radio remote control
return 1
interact(mob/user as mob) /obj/machinery/atmospherics/binary/pump/proc/set_frequency(new_frequency)
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br> radio_controller.remove_object(src, frequency)
<b>Desirable output pressure: </b> frequency = new_frequency
[round(target_pressure,0.1)]kPa | <a href='?src=\ref[src];set_press=1'>Change</a> if(frequency)
"} radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA)
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_pump") /obj/machinery/atmospherics/binary/pump/proc/broadcast_status()
onclose(user, "atmo_pump") if(!radio_connection)
return 0
initialize() var/datum/signal/signal = new
..() signal.transmission_method = 1 //radio signal
if(frequency) signal.source = src
set_frequency(frequency)
receive_signal(datum/signal/signal) signal.data = list(
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) "tag" = id_tag,
return 0 "device" = "AGP",
"power" = on,
"target_output" = target_pressure,
"sigtype" = "status"
)
if("power" in signal.data) radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
on = text2num(signal.data["power"])
if("power_toggle" in signal.data) return 1
on = !on
if("set_output_pressure" in signal.data) /obj/machinery/atmospherics/binary/pump/interact(mob/user as mob)
target_pressure = between( var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
0, <b>Desirable output pressure: </b>
text2num(signal.data["set_output_pressure"]), [round(target_pressure,0.1)]kPa | <a href='?src=\ref[src];set_press=1'>Change</a>
ONE_ATMOSPHERE*50 "}
)
if("status" in signal.data) user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_pump")
spawn(2) onclose(user, "atmo_pump")
broadcast_status()
return //do not update_icon
/obj/machinery/atmospherics/binary/pump/initialize()
..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/pump/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0
if("power" in signal.data)
on = text2num(signal.data["power"])
if("power_toggle" in signal.data)
on = !on
if("set_output_pressure" in signal.data)
target_pressure = between(
0,
text2num(signal.data["set_output_pressure"]),
ONE_ATMOSPHERE*50
)
if("status" in signal.data)
spawn(2) spawn(2)
broadcast_status() broadcast_status()
update_icon() return //do not update_icon
spawn(2)
broadcast_status()
update_icon()
activity_log += text("\[[time_stamp()]\] Remote signal toggled us [on ? "on" : "off"]")
return
/obj/machinery/atmospherics/binary/pump/attack_hand(user as mob)
if(..())
return return
src.add_fingerprint(usr)
if(!src.allowed(user))
attack_hand(user as mob) user << "\red Access denied."
if(..())
return
src.add_fingerprint(usr)
if(!src.allowed(user))
user << "\red Access denied."
return
usr.set_machine(src)
interact(user)
return return
usr.set_machine(src)
interact(user)
return
Topic(href,href_list) /obj/machinery/atmospherics/binary/pump/Topic(href,href_list)
if(..()) return if(..()) return
if(href_list["power"]) if(href_list["power"])
on = !on on = !on
if(href_list["set_press"]) activity_log += text("\[[time_stamp()]\] Real name: [], Key: [] - turned [] \the [].",usr.real_name, usr.key,(on ? "on" : "off"),src)
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num if(href_list["set_press"])
src.target_pressure = max(0, min(4500, new_pressure)) var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
usr.set_machine(src) src.target_pressure = max(0, min(4500, new_pressure))
src.update_icon() usr.set_machine(src)
src.updateUsrDialog() src.update_icon()
return src.updateUsrDialog()
return
power_change() /obj/machinery/atmospherics/binary/pump/power_change()
..() ..()
update_icon() update_icon()
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) /obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench)) if (!istype(W, /obj/item/weapon/wrench))
return ..() return ..()
if (!(stat & NOPOWER) && on) if (!(stat & NOPOWER) && on)
user << "\red You cannot unwrench this [src], turn it off first." user << "\red You cannot unwrench this [src], turn it off first."
return 1 return 1
var/turf/T = src.loc var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact) if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first." user << "\red You must remove the plating first."
return 1 return 1
var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air() var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..." user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40)) if (do_after(user, 40))
user.visible_message( \ user.visible_message( \
"[user] unfastens \the [src].", \ "[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \ "\blue You have unfastened \the [src].", \
"You hear ratchet.") "You hear ratchet.")
new /obj/item/pipe(loc, make_from=src) new /obj/item/pipe(loc, make_from=src)
del(src) del(src)

View File

@@ -12,7 +12,7 @@ Thus, the two variables affect pump operation are set in New():
but overall network volume is also increased as this increases... but overall network volume is also increased as this increases...
*/ */
obj/machinery/atmospherics/binary/volume_pump /obj/machinery/atmospherics/binary/volume_pump
icon = 'icons/obj/atmospherics/volume_pump.dmi' icon = 'icons/obj/atmospherics/volume_pump.dmi'
icon_state = "intact_off" icon_state = "intact_off"
@@ -26,174 +26,175 @@ obj/machinery/atmospherics/binary/volume_pump
var/id_tag = null var/id_tag = null
var/datum/radio_frequency/radio_connection var/datum/radio_frequency/radio_connection
on /obj/machinery/atmospherics/binary/volume_pump/on
on = 1 on = 1
icon_state = "intact_on" icon_state = "intact_on"
update_icon() /obj/machinery/atmospherics/binary/volume_pump/update_icon()
if(stat & NOPOWER) if(stat & NOPOWER)
icon_state = "intact_off" icon_state = "intact_off"
else if(node1 && node2) else if(node1 && node2)
icon_state = "intact_[on?("on"):("off")]" icon_state = "intact_[on?("on"):("off")]"
else
if(node1)
icon_state = "exposed_1_off"
else if(node2)
icon_state = "exposed_2_off"
else else
if(node1) icon_state = "exposed_3_off"
icon_state = "exposed_1_off" return
else if(node2)
icon_state = "exposed_2_off"
else
icon_state = "exposed_3_off"
return
process() /obj/machinery/atmospherics/binary/volume_pump/process()
// ..() // ..()
if(stat & (NOPOWER|BROKEN)) if(stat & (NOPOWER|BROKEN))
return return
if(!on || transfer_rate < 1) if(!on || transfer_rate < 1)
return 0 return 0
// Pump mechanism just won't do anything if the pressure is too high/too low // Pump mechanism just won't do anything if the pressure is too high/too low
var/input_starting_pressure = air1.return_pressure() var/input_starting_pressure = air1.return_pressure()
var/output_starting_pressure = air2.return_pressure() var/output_starting_pressure = air2.return_pressure()
if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000))
return 1
var/transfer_ratio = max(1, transfer_rate/air1.volume)
var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio)
air2.merge(removed)
if(network1)
network1.update = 1
if(network2)
network2.update = 1
if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000))
return 1 return 1
proc var/transfer_ratio = max(1, transfer_rate/air1.volume)
set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
radio_connection = radio_controller.add_object(src, frequency)
broadcast_status() var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio)
if(!radio_connection)
return 0
var/datum/signal/signal = new air2.merge(removed)
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list( if(network1)
"tag" = id_tag, network1.update = 1
"device" = "APV",
"power" = on,
"transfer_rate" = transfer_rate,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal)
return 1 if(network2)
network2.update = 1
interact(mob/user as mob) return 1
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
<b>Desirable output flow: </b>
[round(transfer_rate,1)]l/s | <a href='?src=\ref[src];set_transfer_rate=1'>Change</a>
"}
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_pump") /obj/machinery/atmospherics/binary/volume_pump/proc/set_frequency(new_frequency)
onclose(user, "atmo_pump") radio_controller.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
radio_connection = radio_controller.add_object(src, frequency)
/obj/machinery/atmospherics/binary/volume_pump/proc/broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list(
"tag" = id_tag,
"device" = "APV",
"power" = on,
"transfer_rate" = transfer_rate,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal)
return 1
/obj/machinery/atmospherics/binary/volume_pump/interact(mob/user as mob)
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
<b>Desirable output flow: </b>
[round(transfer_rate,1)]l/s | <a href='?src=\ref[src];set_transfer_rate=1'>Change</a>
"}
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_pump")
onclose(user, "atmo_pump")
initialize() /obj/machinery/atmospherics/binary/volume_pump/initialize()
..() ..()
set_frequency(frequency) set_frequency(frequency)
receive_signal(datum/signal/signal) /obj/machinery/atmospherics/binary/volume_pump/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0 return 0
if("power" in signal.data) if("power" in signal.data)
on = text2num(signal.data["power"]) on = text2num(signal.data["power"])
if("power_toggle" in signal.data) if("power_toggle" in signal.data)
on = !on on = !on
if("set_transfer_rate" in signal.data) if("set_transfer_rate" in signal.data)
transfer_rate = between( transfer_rate = between(
0, 0,
text2num(signal.data["set_transfer_rate"]), text2num(signal.data["set_transfer_rate"]),
air1.volume air1.volume
) )
if("status" in signal.data)
spawn(2)
broadcast_status()
return //do not update_icon
if("status" in signal.data)
spawn(2) spawn(2)
broadcast_status() broadcast_status()
update_icon() return //do not update_icon
spawn(2)
broadcast_status()
update_icon()
activity_log += text("\[[time_stamp()]\] Remote signal toggled us [on ? "on" : "off"]")
attack_hand(user as mob) /obj/machinery/atmospherics/binary/volume_pump/attack_hand(user as mob)
if(..()) if(..())
return
src.add_fingerprint(usr)
if(!src.allowed(user))
user << "\red Access denied."
return
usr.set_machine(src)
interact(user)
return return
src.add_fingerprint(usr)
Topic(href,href_list) if(!src.allowed(user))
if(..()) return user << "\red Access denied."
if(href_list["power"])
on = !on
if(href_list["set_transfer_rate"])
var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",src.transfer_rate) as num
src.transfer_rate = max(0, min(200, new_transfer_rate))
usr.set_machine(src)
src.update_icon()
src.updateUsrDialog()
return return
usr.set_machine(src)
interact(user)
return
power_change() /obj/machinery/atmospherics/binary/volume_pump/Topic(href,href_list)
..() if(..()) return
update_icon() if(href_list["power"])
on = !on
activity_log += text("\[[time_stamp()]\] Real name: [], Key: [] - turned [] \the [].",usr.real_name, usr.key,(on ? "on" : "off"),src)
if(href_list["set_transfer_rate"])
var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",src.transfer_rate) as num
src.transfer_rate = max(0, min(200, new_transfer_rate))
usr.set_machine(src)
src.update_icon()
src.updateUsrDialog()
return
/obj/machinery/atmospherics/binary/volume_pump/power_change()
..()
update_icon()
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) /obj/machinery/atmospherics/binary/volume_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench)) if (!istype(W, /obj/item/weapon/wrench))
return ..() return ..()
if (!(stat & NOPOWER) && on) if (!(stat & NOPOWER) && on)
user << "\red You cannot unwrench this [src], turn it off first." user << "\red You cannot unwrench this [src], turn it off first."
return 1 return 1
var/turf/T = src.loc var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact) if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first." user << "\red You must remove the plating first."
return 1 return 1
var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air() var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..." user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40)) if (do_after(user, 40))
user.visible_message( \ user.visible_message( \
"[user] unfastens \the [src].", \ "[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \ "\blue You have unfastened \the [src].", \
"You hear ratchet.") "You hear ratchet.")
new /obj/item/pipe(loc, make_from=src) new /obj/item/pipe(loc, make_from=src)
del(src) del(src)