diff --git a/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm b/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm index 632b75c0dc8..d3118575cfd 100644 --- a/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm +++ b/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm @@ -21,11 +21,39 @@ ..() if(!node) - return - - var/datum/gas_mixture/removed = air_contents.remove(volume) - loc.assume_air(removed) - air_update_turf() + return 0 + + var/datum/gas_mixture/environment = loc.return_air() + + var/pressure_delta = air_contents.return_pressure() - environment.return_pressure() + + // based on pressure_pump to equalize pressure + // already equalized + if(abs(pressure_delta) < 0.01) + return 1 + + if(pressure_delta > 0) + // transfer from pipe air to environment + if((air_contents.total_moles() > 0) && (air_contents.temperature > 0)) + var/transfer_moles = pressure_delta * environment.volume / (air_contents.temperature * R_IDEAL_GAS_EQUATION) + transfer_moles = min(transfer_moles, volume) + + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + loc.assume_air(removed) + air_update_turf() + else + // transfer from environment to pipe air + pressure_delta = -pressure_delta + if((environment.total_moles() > 0) && (environment.temperature > 0)) + var/transfer_moles = pressure_delta * air_contents.volume / (environment.temperature * R_IDEAL_GAS_EQUATION) + transfer_moles = min(transfer_moles, volume) + + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + air_contents.merge(removed) + air_update_turf() + + parent.update = 1 + return 1 /obj/machinery/atmospherics/unary/passive_vent/update_underlays() if(..())