Files
Batrachophreno 4ecb0bc21c Repath obj/machinery to obj/structure/machinery [MDB Ignore] (#22500)
Repaths obj/machinery to obj/structure/machinery. **Note for
reviewers:** the only meaningful changed code exists within
**code/game/objects/structures.dm** and
**code/game/objects/structures/_machinery.dm**, largely concerning
damage procs. With the exception of moving airlock defines to their own
file, ALL OTHER CHANGES ARE STRICTLY PATH CHANGES.

Objects, _categorically_, are largely divided between those you can hold
in your hand/inventory and those you can't. Machinery objects are
already subtypes of Structures behaviorally, this PR just makes their
pathing reflect that, and allows for future work (tool actions, more
health/destruction functionality) to be developed without unnecessary
code duplication.

I have tested this PR by loading up the Horizon and dismantling various
machines and structures with tools, shooting guns of various types
throughout the ship, and detonating a bunch of explosions throughout the
ship.
2026-05-26 19:35:48 +00:00

298 lines
8.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 transferred 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/structure/machinery/atmospherics/binary/pump
name = "gas pump"
desc = "A pump."
icon = 'icons/atmos/pump.dmi'
icon_state = "map_off"
level = 1
var/base_icon = "pump"
var/target_pressure = ONE_ATMOSPHERE
//var/max_volume_transfer = 10000
use_power = POWER_USE_OFF
idle_power_usage = 150 //internal circuitry, friction losses and stuff
power_rating = 30000 //30000 W ~ 40 HP
var/max_pressure_setting = ATMOS_PUMP_MAX_PRESSURE //kPa
var/frequency = 0
var/id = null
var/datum/radio_frequency/radio_connection
var/broadcast_status_next_process = FALSE
// Measure amount of gas pumped through
var/measure_enabled = FALSE
var/moles_pumped = 0
/obj/structure/machinery/atmospherics/binary/pump/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
. += "This moves gas from one pipe to another. A higher target pressure demands more energy."
. += "The side with the colored end is the output."
. += "The normalized flow rate is the flow rate in L based on the moles transferred normalized to a preassure 1ATM and temperature of 20C."
. += "The same applies to the measurement section."
/obj/structure/machinery/atmospherics/binary/pump/Initialize()
. = ..()
air1.volume = ATMOS_DEFAULT_VOLUME_PUMP
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP
/obj/structure/machinery/atmospherics/binary/pump/on
icon_state = "map_on"
use_power = POWER_USE_IDLE
/obj/structure/machinery/atmospherics/binary/pump/fuel
icon_state = "map_off-fuel"
base_icon = "pump-fuel"
icon_connect_type = "-fuel"
connect_types = CONNECT_TYPE_FUEL
/obj/structure/machinery/atmospherics/binary/pump/fuel/on
icon_state = "map_on-fuel"
use_power = POWER_USE_IDLE
/obj/structure/machinery/atmospherics/binary/pump/aux
icon_state = "map_off-aux"
base_icon = "pump-aux"
icon_connect_type = "-aux"
connect_types = CONNECT_TYPE_AUX
/obj/structure/machinery/atmospherics/binary/pump/aux/on
icon_state = "map_on-aux"
use_power = POWER_USE_IDLE
/obj/structure/machinery/atmospherics/binary/pump/supply
icon_state = "map_off-supply"
base_icon = "pump-supply"
icon_connect_type = "-supply"
connect_types = CONNECT_TYPE_SUPPLY
/obj/structure/machinery/atmospherics/binary/pump/supply/on
icon_state = "map_on-supply"
use_power = POWER_USE_IDLE
/obj/structure/machinery/atmospherics/binary/pump/scrubber
icon_state = "map_off-scrubber"
base_icon = "pump-scrubber"
icon_connect_type = "-scrubber"
connect_types = CONNECT_TYPE_SCRUBBER
/obj/structure/machinery/atmospherics/binary/pump/scrubber/on
icon_state = "map_on-scrubber"
use_power = POWER_USE_IDLE
/obj/structure/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/structure/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/structure/machinery/atmospherics/binary/pump/hide(var/i)
update_underlays()
/obj/structure/machinery/atmospherics/binary/pump/process()
last_power_draw = 0
last_flow_rate = 0
last_mole_transfer = 0
if((stat & (NOPOWER|BROKEN)) || !use_power)
return
if (broadcast_status_next_process)
broadcast_status()
broadcast_status_next_process = FALSE
var/power_draw = -1
var/pressure_delta = target_pressure - XGM_PRESSURE(air2)
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_oneoff(power_draw)
if(network1)
network1.update = 1
if(network2)
network2.update = 1
if (measure_enabled)
moles_pumped += last_mole_transfer
return 1
//Radio remote control
/obj/structure/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/structure/machinery/atmospherics/binary/pump/proc/broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = TRANSMISSION_RADIO
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/structure/machinery/atmospherics/binary/pump/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "AtmosPump", capitalize_first_letters(name))
ui.open()
/obj/structure/machinery/atmospherics/binary/pump/ui_data()
var/data = list()
data["on"] = use_power
data["pressure"] = round(target_pressure)
data["max_pressure"] = max_pressure_setting
data["power_draw"] = round(last_power_draw)
data["max_power_draw"] = power_rating
data["flow_rate"] = round(last_flow_rate)
data["flow_rate_normal"] = round((last_mole_transfer * R_IDEAL_GAS_EQUATION * T20C) / ONE_ATMOSPHERE)
data["measure_enabled"] = measure_enabled
data["moles_pumped"] = round(moles_pumped)
data["liters_pumped"] = round((moles_pumped * R_IDEAL_GAS_EQUATION * T20C) / ONE_ATMOSPHERE)
return data
/obj/structure/machinery/atmospherics/binary/pump/ui_act(action, params)
. = ..()
if(.)
return
switch(action)
if("power")
update_use_power(!use_power)
. = TRUE
if("pressure")
var/pressure = params["pressure"]
if(pressure == "max")
pressure = ATMOS_PUMP_MAX_PRESSURE
. = TRUE
else if(text2num(pressure) != null)
pressure = text2num(pressure)
. = TRUE
if(.)
target_pressure = clamp(pressure, 0, ATMOS_PUMP_MAX_PRESSURE)
if("toggle_measure")
measure_enabled = !measure_enabled
if("reset_measure")
moles_pumped = 0
update_icon()
/obj/structure/machinery/atmospherics/binary/pump/atmos_init()
..()
if(frequency)
set_frequency(frequency)
/obj/structure/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(POWER_USE_IDLE)
else
update_use_power(POWER_USE_OFF)
if("power_toggle" in signal.data)
update_use_power(!use_power)
if(signal.data["set_output_pressure"])
target_pressure = clamp(
text2num(signal.data["set_output_pressure"]),
0,
ATMOS_PUMP_MAX_PRESSURE
)
if(signal.data["status"])
broadcast_status_next_process = TRUE
return //do not update_icon
broadcast_status_next_process = TRUE
update_icon()
/obj/structure/machinery/atmospherics/binary/pump/attack_hand(user as mob)
if(..())
return
src.add_fingerprint(usr)
if(!src.allowed(user))
to_chat(user, SPAN_WARNING("Access denied."))
return
usr.set_machine(src)
ui_interact(user)
return
/obj/structure/machinery/atmospherics/binary/pump/power_change()
var/old_stat = stat
..()
if(old_stat != stat)
update_icon()
/obj/structure/machinery/atmospherics/binary/pump/attackby(obj/item/attacking_item, mob/user)
if (attacking_item.tool_behaviour != TOOL_WRENCH && !istype(attacking_item, /obj/item/pipewrench))
return ..()
if (!(stat & NOPOWER) && use_power)
to_chat(user, SPAN_WARNING("You cannot unwrench this [src], turn it off first."))
return TRUE
var/datum/gas_mixture/int_air = return_air()
if (!loc) return FALSE
var/datum/gas_mixture/env_air = loc.return_air()
if ((XGM_PRESSURE(int_air)-XGM_PRESSURE(env_air)) > PRESSURE_EXERTED && !istype(attacking_item, /obj/item/pipewrench))
to_chat(user, SPAN_WARNING("You cannot unwrench this [src], it's too exerted due to internal pressure."))
add_fingerprint(user)
return TRUE
else
to_chat(user, SPAN_WARNING("You struggle to unwrench \the [src] with your pipe wrench."))
to_chat(user, SPAN_NOTICE("You begin to unfasten \the [src]..."))
if(attacking_item.use_tool(src, user, istype(attacking_item, /obj/item/pipewrench) ? 80 : 40, volume = 50))
user.visible_message( \
SPAN_NOTICE("\The [user] unfastens \the [src]."), \
SPAN_NOTICE("You have unfastened \the [src]."), \
"You hear a ratchet.")
new /obj/item/pipe(loc, make_from=src)
qdel(src)
return TRUE