This commit is contained in:
Lucy
2021-12-22 20:01:30 -05:00
parent bd9f5d0aed
commit a9b511d30e
10 changed files with 71 additions and 50 deletions

View File

@@ -497,3 +497,8 @@ GLOBAL_LIST_INIT(pipe_paint_colors, list(
#define MIASMA_CORPSE_MOLES 0.02
#define MIASMA_GIBS_MOLES 0.005
//PIPENET UPDATE STATUS
#define PIPENET_UPDATE_STATUS_DORMANT 0
#define PIPENET_UPDATE_STATUS_REACT_NEEDED 1
#define PIPENET_UPDATE_STATUS_RECONCILE_NEEDED 2

View File

@@ -157,6 +157,20 @@ nobliumformation = 1001
if(istype(location) && prob(10))
radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR)
/proc/fusion_ball(datum/holder, reaction_energy, instability)
var/turf/open/location
if (istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet.
var/datum/pipeline/fusion_pipenet = holder
location = get_turf(pick(fusion_pipenet.members))
else
location = get_turf(holder)
if(location)
var/particle_chance = ((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1//Asymptopically approaches 100% as the energy of the reaction goes up.
if(prob(PERCENT(particle_chance)))
location.fire_nuclear_particle()
var/rad_power = max((FUSION_RAD_COEFFICIENT/instability) + FUSION_RAD_MAX,0)
radiation_pulse(location,rad_power)
/datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder)
var/energy_released = 0
var/old_heat_capacity = air.heat_capacity()

View File

@@ -53,7 +53,8 @@
/obj/machinery/atmospherics/components/binary/dp_vent_pump/process_atmos()
..()
if(welded || !is_operational() || !isopenturf(loc))
return FALSE
if(!on)
return
var/datum/gas_mixture/air1 = airs[1]
@@ -75,13 +76,13 @@
var/transfer_moles = pressure_delta*environment.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION)
loc.assume_air_moles(air1, transfer_moles)
air_update_turf()
var/datum/pipeline/parent1 = parents[1]
parent1.update = 1
parent1.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED
else //external -> output
if(environment.return_pressure() > 0)
var/our_multiplier = air2.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION)
var/moles_delta = 10000 * our_multiplier
@@ -89,16 +90,15 @@
moles_delta = min(moles_delta, (environment_pressure - output_pressure_max) * environment.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION))
if(pressure_checks&INPUT_MIN)
moles_delta = min(moles_delta, (input_pressure_min - air2.return_pressure()) * our_multiplier)
if(moles_delta > 0)
loc.transfer_air(air2, moles_delta)
air_update_turf()
var/datum/pipeline/parent2 = parents[2]
parent2.update = 1
//Radio remote control
parent2.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED
//Radio remote control
/obj/machinery/atmospherics/components/binary/dp_vent_pump/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency

View File

@@ -57,26 +57,7 @@ Passive gate is similar to the regular pump except:
var/datum/gas_mixture/air1 = airs[1]
var/datum/gas_mixture/air2 = airs[2]
var/output_starting_pressure = air2.return_pressure()
var/input_starting_pressure = air1.return_pressure()
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
//Need at least 10 KPa difference to overcome friction in the mechanism
return
//Calculate necessary moles to transfer using PV = nRT
if((air1.total_moles() > 0) && (air1.return_temperature()>0))
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
var/transfer_moles = pressure_delta*air2.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
air2.merge(removed)
if(air1.release_gas_to(air2, target_pressure))
update_parents()

View File

@@ -32,18 +32,31 @@
icon_state = "tpump_[on && is_operational() ? "on" : "off"]-[set_overlay_offset(piping_layer)]"
/obj/machinery/atmospherics/components/binary/temperature_pump/process_atmos()
..()
if(!on || !is_operational())
return
var/datum/gas_mixture/air_input = airs[1]
var/datum/gas_mixture/air_output = airs[2]
if((air_output.return_temperature() + heat_transfer_rate) >= air_input.return_temperature() || (air_input.return_temperature() - heat_transfer_rate) <= TCRYO)
if(!QUANTIZE(air_input.total_moles()) || !QUANTIZE(air_output.total_moles())) //Don't transfer if there's no gas
return
var/datum/gas_mixture/remove_input = air_input.remove_ratio(0.9)
var/datum/gas_mixture/remove_output = air_output.remove_ratio(0.9)
var/coolant_temperature_delta = remove_input.return_temperature() - remove_output.return_temperature()
if(coolant_temperature_delta > 0)
var/input_capacity = remove_input.heat_capacity()
var/output_capacity = air_output.heat_capacity()
var/cooling_heat_amount = (heat_transfer_rate * 0.01) * coolant_temperature_delta * (input_capacity * output_capacity / (input_capacity + output_capacity))
remove_input.set_temperature(max(remove_input.return_temperature() - (cooling_heat_amount / input_capacity), TCMB))
remove_output.set_temperature(max(remove_output.return_temperature() + (cooling_heat_amount / output_capacity), TCMB))
air_input.merge(remove_input)
air_output.merge(remove_output)
air_input.set_temperature(air_input.return_temperature() - heat_transfer_rate)
air_output.set_temperature(air_output.return_temperature() + heat_transfer_rate)
update_parents()
/obj/machinery/atmospherics/components/binary/temperature_pump/ui_interact(mob/user, datum/tgui/ui)

View File

@@ -24,6 +24,17 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
var/switching = FALSE
/obj/machinery/atmospherics/components/binary/valve/Destroy()
//Should only happen on extreme circumstances
if(on)
//Let's give presumably now-severed pipenets a chance to scramble for what's happening at next SSair fire()
if(parents[1])
parents[1].update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED
if(parents[2])
parents[2].update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED
. = ..()
/obj/machinery/atmospherics/components/binary/valve/update_icon_nopipes(animation = FALSE)
normalize_cardinal_directions()
if(animation)

View File

@@ -133,10 +133,11 @@
for(var/i in 1 to device_type)
var/datum/pipeline/parent = parents[i]
if(!parent)
WARNING("Component is missing a pipenet! Rebuilding...")
//WARNING("Component is missing a pipenet! Rebuilding...")
//At pre-SSair_rebuild_pipenets times, not having a parent wasn't supposed to happen
SSair.add_to_rebuild_queue(src)
else
parent.update = 1
continue
parent.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED
/obj/machinery/atmospherics/components/returnPipenets()
. = list()

View File

@@ -110,15 +110,15 @@
if(transfer_moles1)
air1.transfer_to(air3, transfer_moles1)
var/datum/pipeline/parent1 = parents[1]
parent1.update = TRUE
parent1.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED
if(transfer_moles2)
air2.transfer_to(air3, transfer_moles2)
var/datum/pipeline/parent2 = parents[2]
parent2.update = TRUE
parent2.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED
var/datum/pipeline/parent3 = parents[3]
parent3.update = TRUE
parent3.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED
/obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)

View File

@@ -466,21 +466,17 @@
if(timing && valve_timer < world.time)
valve_open = !valve_open
timing = FALSE
// Handle gas transfer.
if(valve_open)
var/turf/T = get_turf(src)
pump.airs[1] = air_contents
pump.airs[2] = holding ? holding.air_contents : T.return_air()
pump.target_pressure = release_pressure
pump.process_atmos() // Pump gas.
if(!holding)
air_update_turf() // Update the environment if needed.
else
pump.airs[1] = null
pump.airs[2] = null
var/datum/gas_mixture/target_air = holding ? holding.air_contents : T.return_air()
if(air_contents.release_gas_to(target_air, release_pressure) && !holding)
air_update_turf()
update_icon()
/obj/machinery/portable_atmospherics/canister/ui_state(mob/user)
return GLOB.physical_state

View File

@@ -45,7 +45,7 @@
return ..()
/obj/machinery/portable_atmospherics/process_atmos()
if(!connected_port) // Pipe network handles reactions if connected.
if(!connected_port && air_contents != null && src != null) // Pipe network handles reactions if connected.
air_contents.react(src)
/obj/machinery/portable_atmospherics/return_air()
@@ -63,8 +63,7 @@
//Perform the connection
connected_port = new_port
connected_port.connected_device = src
var/datum/pipeline/connected_port_parent = connected_port.parents[1]
connected_port_parent.reconcile_air()
connected_port.parents[1].update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED
anchored = TRUE //Prevent movement
pixel_x = new_port.pixel_x
@@ -72,6 +71,7 @@
update_icon()
return TRUE
/obj/machinery/portable_atmospherics/Move()
. = ..()
if(.)