diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index 94d8959987..d1daa720ca 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -20,28 +20,36 @@ /obj/machinery/atmospherics/components/unary/passive_vent/process_atmos() ..() - var/datum/gas_mixture/environment = loc.return_air() - var/environment_pressure = environment.return_pressure() - var/pressure_delta = abs(environment_pressure - airs[1].return_pressure()) + var/active = FALSE - if((environment.temperature || airs[1].temperature) && pressure_delta > 0.5) - if(environment_pressure < airs[1].return_pressure()) - var/air_temperature = (environment.temperature > 0) ? environment.temperature : airs[1].temperature - var/transfer_moles = (pressure_delta * environment.volume) / (air_temperature * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = airs[1].remove(transfer_moles) - loc.assume_air(removed) - air_update_turf() + var/datum/gas_mixture/external = loc.return_air() + var/datum/gas_mixture/internal = airs[1] + var/external_pressure = external.return_pressure() + var/internal_pressure = internal.return_pressure() + var/pressure_delta = abs(external_pressure - internal_pressure) + + if(pressure_delta > 0.5) + if(external_pressure < internal_pressure) + var/air_temperature = (external.temperature > 0) ? external.temperature : internal.temperature + var/transfer_moles = (pressure_delta * external.volume) / (air_temperature * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = internal.remove(transfer_moles) + external.merge(removed) else - var/air_temperature = (airs[1].temperature > 0) ? airs[1].temperature : environment.temperature - var/output_volume = airs[1].volume - var/transfer_moles = (pressure_delta * output_volume) / (air_temperature * R_IDEAL_GAS_EQUATION) - transfer_moles = min(transfer_moles, environment.total_moles()*airs[1].volume/environment.volume) - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + var/air_temperature = (internal.temperature > 0) ? internal.temperature : external.temperature + var/transfer_moles = (pressure_delta * internal.volume) / (air_temperature * R_IDEAL_GAS_EQUATION) + transfer_moles = min(transfer_moles, external.total_moles() * internal.volume / external.volume) + var/datum/gas_mixture/removed = external.remove(transfer_moles) if(isnull(removed)) return - airs[1].merge(removed) - air_update_turf() - update_parents() + internal.merge(removed) + + active = TRUE + + active = internal.temperature_share(external, OPEN_HEAT_TRANSFER_COEFFICIENT) ? TRUE : active + + if(active) + air_update_turf() + update_parents() /obj/machinery/atmospherics/components/unary/passive_vent/can_crawl_through() return TRUE