mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-09 07:57:00 +00:00
304 lines
8.4 KiB
Plaintext
304 lines
8.4 KiB
Plaintext
/*
|
|
Every cycle, the pump uses the air in air_in to try and make air_out the perfect pressure.
|
|
|
|
node1, air1, network1 correspond to input
|
|
node2, air2, network2 correspond to output
|
|
|
|
Thus, the two variables affect pump operation are set in New():
|
|
air1.volume
|
|
This is the volume of gas available to the pump that may be transfered to the output
|
|
air2.volume
|
|
Higher quantities of this cause more air to be perfected later
|
|
but overall network volume is also increased as this increases...
|
|
*/
|
|
|
|
/obj/machinery/atmospherics/binary/pump
|
|
icon = 'icons/atmos/pump.dmi'
|
|
icon_state = "map_off"
|
|
construction_type = /obj/item/pipe/directional
|
|
pipe_state = "pump"
|
|
level = 1
|
|
var/base_icon = "pump"
|
|
|
|
name = "gas pump"
|
|
desc = "A pump that moves gas from one place to another."
|
|
|
|
var/target_pressure = ONE_ATMOSPHERE
|
|
|
|
//var/max_volume_transfer = 10000
|
|
|
|
use_power = USE_POWER_OFF
|
|
idle_power_usage = 150 //internal circuitry, friction losses and stuff
|
|
power_rating = 7500 //7500 W ~ 10 HP
|
|
|
|
var/max_pressure_setting = 15000 //kPa
|
|
|
|
var/frequency = ZERO_FREQ
|
|
var/id = null
|
|
var/datum/radio_frequency/radio_connection
|
|
|
|
/obj/machinery/atmospherics/binary/pump/Initialize(mapload)
|
|
. = ..()
|
|
|
|
air1.volume = ATMOS_DEFAULT_VOLUME_PUMP
|
|
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP
|
|
if(frequency)
|
|
set_frequency(frequency)
|
|
|
|
/obj/machinery/atmospherics/binary/pump/Destroy()
|
|
unregister_radio(src, frequency)
|
|
. = ..()
|
|
|
|
/obj/machinery/atmospherics/binary/pump/on
|
|
icon_state = "map_on"
|
|
use_power = USE_POWER_IDLE
|
|
|
|
/obj/machinery/atmospherics/binary/pump/fuel
|
|
icon_state = "map_off-fuel"
|
|
base_icon = "pump-fuel"
|
|
icon_connect_type = "-fuel"
|
|
connect_types = CONNECT_TYPE_FUEL
|
|
|
|
/obj/machinery/atmospherics/binary/pump/fuel/on
|
|
icon_state = "map_on-fuel"
|
|
use_power = USE_POWER_IDLE
|
|
|
|
/obj/machinery/atmospherics/binary/pump/aux
|
|
icon_state = "map_off-aux"
|
|
base_icon = "pump-aux"
|
|
icon_connect_type = "-aux"
|
|
connect_types = CONNECT_TYPE_AUX
|
|
|
|
/obj/machinery/atmospherics/binary/pump/aux/on
|
|
icon_state = "map_on-aux"
|
|
use_power = USE_POWER_IDLE
|
|
|
|
/obj/machinery/atmospherics/binary/pump/update_icon()
|
|
if(!powered())
|
|
icon_state = "[base_icon]-off"
|
|
else
|
|
icon_state = "[use_power ? "[base_icon]-on" : "[base_icon]-off"]"
|
|
|
|
/obj/machinery/atmospherics/binary/pump/update_underlays()
|
|
if(..())
|
|
underlays.Cut()
|
|
var/turf/T = get_turf(src)
|
|
if(!istype(T))
|
|
return
|
|
add_underlay(T, node1, turn(dir, -180), node1?.icon_connect_type)
|
|
add_underlay(T, node2, dir, node2?.icon_connect_type)
|
|
|
|
/obj/machinery/atmospherics/binary/pump/hide(var/i)
|
|
update_underlays()
|
|
|
|
/obj/machinery/atmospherics/binary/pump/process()
|
|
last_power_draw = 0
|
|
last_flow_rate = 0
|
|
|
|
if((stat & (NOPOWER|BROKEN)) || !use_power)
|
|
return
|
|
|
|
var/power_draw = -1
|
|
var/pressure_delta = target_pressure - air2.return_pressure()
|
|
|
|
if(pressure_delta > 0.01 && air1.temperature > 0)
|
|
//Figure out how much gas to transfer to meet the target pressure.
|
|
var/transfer_moles = calculate_transfer_moles(air1, air2, pressure_delta, (network2)? network2.volume : 0)
|
|
power_draw = pump_gas(src, air1, air2, transfer_moles, power_rating)
|
|
|
|
if (power_draw >= 0)
|
|
last_power_draw = power_draw
|
|
use_power(power_draw)
|
|
|
|
if(network1)
|
|
network1.update = 1
|
|
|
|
if(network2)
|
|
network2.update = 1
|
|
|
|
return 1
|
|
|
|
//Radio remote control
|
|
|
|
/obj/machinery/atmospherics/binary/pump/proc/set_frequency(new_frequency)
|
|
SSradio.remove_object(src, frequency)
|
|
frequency = new_frequency
|
|
if(frequency)
|
|
radio_connection = SSradio.add_object(src, frequency, radio_filter = RADIO_ATMOSIA)
|
|
|
|
/obj/machinery/atmospherics/binary/pump/proc/broadcast_status()
|
|
if(!radio_connection)
|
|
return 0
|
|
|
|
var/datum/signal/signal = new
|
|
signal.transmission_method = TRANSMISSION_RADIO //radio signal
|
|
signal.source = src
|
|
|
|
signal.data = list(
|
|
"tag" = id,
|
|
"device" = "AGP",
|
|
"power" = use_power,
|
|
"target_output" = target_pressure,
|
|
"sigtype" = "status"
|
|
)
|
|
|
|
radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
|
|
|
|
return 1
|
|
|
|
/obj/machinery/atmospherics/binary/pump/tgui_interact(mob/user, datum/tgui/ui)
|
|
if(stat & (BROKEN|NOPOWER))
|
|
return
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "GasPump", name)
|
|
ui.open()
|
|
|
|
/obj/machinery/atmospherics/binary/pump/tgui_data(mob/user)
|
|
// this is the data which will be sent to the ui
|
|
var/data[0]
|
|
|
|
data = list(
|
|
"on" = use_power,
|
|
"pressure_set" = round(target_pressure*100), //Nano UI can't handle rounded non-integers, apparently.
|
|
"max_pressure" = max_pressure_setting,
|
|
"last_flow_rate" = round(last_flow_rate*10),
|
|
"last_power_draw" = round(last_power_draw),
|
|
"max_power_draw" = power_rating,
|
|
)
|
|
|
|
return data
|
|
|
|
/obj/machinery/atmospherics/binary/pump/receive_signal(datum/signal/signal)
|
|
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
|
|
return 0
|
|
|
|
if(signal.data["power"])
|
|
if(text2num(signal.data["power"]))
|
|
update_use_power(USE_POWER_IDLE)
|
|
else
|
|
update_use_power(USE_POWER_OFF)
|
|
|
|
if("power_toggle" in signal.data)
|
|
update_use_power(!use_power)
|
|
|
|
if(signal.data["set_output_pressure"])
|
|
target_pressure = between(0, text2num(signal.data["set_output_pressure"]), ONE_ATMOSPHERE*50)
|
|
|
|
if(signal.data["status"])
|
|
spawn(2)
|
|
broadcast_status()
|
|
return //do not update_icon
|
|
|
|
spawn(2)
|
|
broadcast_status()
|
|
update_icon()
|
|
return
|
|
|
|
/obj/machinery/atmospherics/binary/pump/attack_ghost(mob/user)
|
|
tgui_interact(user)
|
|
|
|
/obj/machinery/atmospherics/binary/pump/attack_hand(mob/user)
|
|
if(..())
|
|
return
|
|
add_fingerprint(user)
|
|
if(!allowed(user))
|
|
to_chat(user, span_warning("Access denied."))
|
|
return
|
|
tgui_interact(user)
|
|
|
|
/obj/machinery/atmospherics/binary/pump/tgui_act(action, params, datum/tgui/ui)
|
|
if(..())
|
|
return TRUE
|
|
|
|
switch(action)
|
|
if("power")
|
|
update_use_power(!use_power)
|
|
. = TRUE
|
|
if("set_press")
|
|
var/press = params["press"]
|
|
switch(press)
|
|
if("min")
|
|
target_pressure = 0
|
|
if("max")
|
|
target_pressure = max_pressure_setting
|
|
if("set")
|
|
var/new_pressure = tgui_input_number(ui.user,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure control",src.target_pressure,max_pressure_setting,0)
|
|
src.target_pressure = between(0, new_pressure, max_pressure_setting)
|
|
. = TRUE
|
|
|
|
add_fingerprint(ui.user)
|
|
update_icon()
|
|
|
|
/obj/machinery/atmospherics/binary/pump/power_change()
|
|
var/old_stat = stat
|
|
..()
|
|
if(old_stat != stat)
|
|
update_icon()
|
|
|
|
/obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/W as obj, var/mob/user as mob)
|
|
if (!W.has_tool_quality(TOOL_WRENCH))
|
|
return ..()
|
|
if (!(stat & NOPOWER) && use_power)
|
|
to_chat(user, span_warning("You cannot unwrench this [src], turn it off first."))
|
|
return 1
|
|
if(!can_unwrench())
|
|
to_chat(user, span_warning("You cannot unwrench this [src], it too exerted due to internal pressure."))
|
|
add_fingerprint(user)
|
|
return 1
|
|
playsound(src, W.usesound, 50, 1)
|
|
to_chat(user, span_notice("You begin to unfasten \the [src]..."))
|
|
if (do_after(user, 40 * W.toolspeed, target = src))
|
|
user.visible_message( \
|
|
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
|
|
span_notice("You have unfastened \the [src]."), \
|
|
"You hear ratchet.")
|
|
deconstruct()
|
|
|
|
//CHOMPEdit Start - Adds TGStation keybinds to save our engineers some time.
|
|
/obj/machinery/atmospherics/binary/pump/click_alt(mob/user)
|
|
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
if(allowed(user))
|
|
to_chat(user, span_notice("You set the [name] to max output"))
|
|
target_pressure = max_pressure_setting
|
|
add_fingerprint(user)
|
|
else
|
|
to_chat(user, span_warning("Access denied."))
|
|
|
|
/obj/machinery/atmospherics/binary/pump/click_ctrl(mob/user)
|
|
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
if(allowed(user))
|
|
update_use_power(!use_power)
|
|
update_icon()
|
|
add_fingerprint(user)
|
|
if(use_power)
|
|
to_chat(user, span_notice("You toggle the [name] on."))
|
|
else
|
|
to_chat(user, span_notice("You toggle the [name] off."))
|
|
|
|
else
|
|
to_chat(user, span_warning("Access denied."))
|
|
//CHOMPEdit End
|
|
|
|
/obj/machinery/atmospherics/binary/pump/high_power
|
|
icon = 'icons/atmos/volume_pump.dmi'
|
|
icon_state = "map_off"
|
|
construction_type = /obj/item/pipe/directional
|
|
pipe_state = "volumepump"
|
|
level = 1
|
|
|
|
name = "high power gas pump"
|
|
desc = "A pump that moves gas from one place to another. Has double the power rating of the standard gas pump."
|
|
|
|
power_rating = 15000 //15000 W ~ 20 HP
|
|
|
|
/obj/machinery/atmospherics/binary/pump/high_power/on
|
|
use_power = USE_POWER_IDLE
|
|
icon_state = "map_on"
|
|
|
|
/obj/machinery/atmospherics/binary/pump/high_power/update_icon()
|
|
if(!powered())
|
|
icon_state = "off"
|
|
else
|
|
icon_state = "[use_power ? "on" : "off"]"
|