mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 15:42:35 +00:00
changes: Maps are no longer compiled in, instead loaded directly from the DMMs at runtime. Z level defines have been moved from the config to map datums. Unit tests now use typecaches. DMMS now actually works. DMMS has been updated slightly. DMMS is now capable of loading simple lists of non-text types. DMMS is now faster when loading many types without mapped in attributes and when loading area instances. Asteroid generation is now defined on the map datum instead of being hard-coded in SSasteroid. Holodeck presets are now defined on the map datum. Atmos machinery now uses Initialize().
237 lines
6.9 KiB
Plaintext
237 lines
6.9 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"
|
|
level = 1
|
|
|
|
name = "gas pump"
|
|
desc = "A pump"
|
|
|
|
var/target_pressure = ONE_ATMOSPHERE
|
|
|
|
//var/max_volume_transfer = 10000
|
|
|
|
use_power = 0
|
|
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 = 0
|
|
var/id = null
|
|
var/datum/radio_frequency/radio_connection
|
|
|
|
/obj/machinery/atmospherics/binary/pump/Initialize()
|
|
. = ..()
|
|
air1.volume = ATMOS_DEFAULT_VOLUME_PUMP
|
|
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP
|
|
|
|
/obj/machinery/atmospherics/binary/pump/on
|
|
icon_state = "map_on"
|
|
use_power = 1
|
|
|
|
|
|
/obj/machinery/atmospherics/binary/pump/update_icon()
|
|
if(!powered())
|
|
icon_state = "off"
|
|
else
|
|
icon_state = "[use_power ? "on" : "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))
|
|
add_underlay(T, node2, dir)
|
|
|
|
/obj/machinery/atmospherics/binary/pump/hide(var/i)
|
|
update_underlays()
|
|
|
|
/obj/machinery/atmospherics/binary/pump/machinery_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, filter = RADIO_ATMOSIA)
|
|
|
|
/obj/machinery/atmospherics/binary/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,
|
|
"device" = "AGP",
|
|
"power" = use_power,
|
|
"target_output" = target_pressure,
|
|
"sigtype" = "status"
|
|
)
|
|
|
|
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
|
|
|
|
return 1
|
|
|
|
/obj/machinery/atmospherics/binary/pump/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
|
if(stat & (BROKEN|NOPOWER))
|
|
return
|
|
|
|
// 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
|
|
)
|
|
|
|
// update the ui if it exists, returns null if no ui is passed/found
|
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
|
if (!ui)
|
|
// the ui does not exist, so we'll create a new() one
|
|
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
|
|
ui = new(user, src, ui_key, "gas_pump.tmpl", name, 470, 290)
|
|
ui.set_initial_data(data) // when the ui is first opened this is the data it will use
|
|
ui.open() // open the new ui window
|
|
ui.set_auto_update(1) // auto update every Master Controller tick
|
|
|
|
/obj/machinery/atmospherics/binary/pump/atmos_init()
|
|
..()
|
|
if(frequency)
|
|
set_frequency(frequency)
|
|
|
|
/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"]))
|
|
use_power = 1
|
|
else
|
|
use_power = 0
|
|
|
|
if("power_toggle" in signal.data)
|
|
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"])
|
|
addtimer(CALLBACK(src, .proc/broadcast_status), 2, TIMER_UNIQUE)
|
|
return //do not update_icon
|
|
|
|
addtimer(CALLBACK(src, .proc/broadcast_status), 2, TIMER_UNIQUE)
|
|
update_icon()
|
|
return
|
|
|
|
/obj/machinery/atmospherics/binary/pump/attack_hand(user as mob)
|
|
if(..())
|
|
return
|
|
src.add_fingerprint(usr)
|
|
if(!src.allowed(user))
|
|
user << "<span class='warning'>Access denied.</span>"
|
|
return
|
|
usr.set_machine(src)
|
|
ui_interact(user)
|
|
return
|
|
|
|
/obj/machinery/atmospherics/binary/pump/Topic(href,href_list)
|
|
if(..()) return 1
|
|
|
|
if(href_list["power"])
|
|
use_power = !use_power
|
|
|
|
switch(href_list["set_press"])
|
|
if ("min")
|
|
target_pressure = 0
|
|
if ("max")
|
|
target_pressure = max_pressure_setting
|
|
if ("set")
|
|
var/new_pressure = input(usr,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure control",src.target_pressure) as num
|
|
src.target_pressure = between(0, new_pressure, max_pressure_setting)
|
|
|
|
usr.set_machine(src)
|
|
src.add_fingerprint(usr)
|
|
|
|
src.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/weapon/W as obj, var/mob/user as mob)
|
|
if (!iswrench(W))
|
|
return ..()
|
|
if (!(stat & NOPOWER) && use_power)
|
|
user << "<span class='warning'>You cannot unwrench this [src], turn it off first.</span>"
|
|
return 1
|
|
var/datum/gas_mixture/int_air = return_air()
|
|
var/datum/gas_mixture/env_air = loc.return_air()
|
|
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
|
|
user << "<span class='warning'>You cannot unwrench this [src], it too exerted due to internal pressure.</span>"
|
|
add_fingerprint(user)
|
|
return 1
|
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
|
user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
|
|
if (do_after(user, 40, act_target = src))
|
|
user.visible_message( \
|
|
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
|
"<span class='notice'>You have unfastened \the [src].</span>", \
|
|
"You hear ratchet.")
|
|
new /obj/item/pipe(loc, make_from=src)
|
|
qdel(src)
|