mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
AGH
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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(.)
|
||||
|
||||
Reference in New Issue
Block a user