Removes delta_time from the atmos system. (#57478)

Why?

delta_time is about maintaining behavior when changing the wait of subsystems
SSair's wait is dynamic by design, we hardly ever hit below it. What is important then, is maintaining behavior
across each process.

The key point here is making sure excited groups and turfs share the same amoumt of gas each process, no matter
how high or low wait is. This is why subprocesses are a thing in the first place, to maintain this consistency.
delta_time fucks with this, and will end up changing behavior if wait is ever changed.
This commit is contained in:
LemonInTheDark
2021-03-07 22:11:02 -08:00
committed by GitHub
parent 6320fc87bc
commit 0001ae31cd
12 changed files with 50 additions and 52 deletions

View File

@@ -224,9 +224,9 @@
/// (kPa) What pressure pumps and powered equipment max out at. /// (kPa) What pressure pumps and powered equipment max out at.
#define MAX_OUTPUT_PRESSURE 4500 #define MAX_OUTPUT_PRESSURE 4500
/// (L/s) Maximum speed powered equipment can work at. /// (L/s) Maximum speed powered equipment can work at.
#define MAX_TRANSFER_RATE 400 #define MAX_TRANSFER_RATE 200
/// How many percent of the contents that an overclocked volume pumps leak into the air /// How many percent of the contents that an overclocked volume pumps leak into the air
#define VOLUME_PUMP_LEAK_AMOUNT 0.2 #define VOLUME_PUMP_LEAK_AMOUNT 0.1
//used for device_type vars //used for device_type vars
#define UNARY 1 #define UNARY 1
#define BINARY 2 #define BINARY 2

View File

@@ -82,7 +82,6 @@ SUBSYSTEM_DEF(air)
/datum/controller/subsystem/air/fire(resumed = FALSE) /datum/controller/subsystem/air/fire(resumed = FALSE)
var/timer = TICK_USAGE_REAL var/timer = TICK_USAGE_REAL
var/delta_time = wait * 0.1
// Every time we fire, we want to make sure pipenets are rebuilt. The game state could have changed between each fire() proc call // Every time we fire, we want to make sure pipenets are rebuilt. The game state could have changed between each fire() proc call
// and anything missing a pipenet can lead to unintended behaviour at worse and various runtimes at best. // and anything missing a pipenet can lead to unintended behaviour at worse and various runtimes at best.
@@ -103,7 +102,7 @@ SUBSYSTEM_DEF(air)
timer = TICK_USAGE_REAL timer = TICK_USAGE_REAL
if(!resumed) if(!resumed)
cached_cost = 0 cached_cost = 0
process_pipenets(delta_time, resumed) process_pipenets(resumed)
cached_cost += TICK_USAGE_REAL - timer cached_cost += TICK_USAGE_REAL - timer
if(state != SS_RUNNING) if(state != SS_RUNNING)
return return
@@ -115,7 +114,7 @@ SUBSYSTEM_DEF(air)
timer = TICK_USAGE_REAL timer = TICK_USAGE_REAL
if(!resumed) if(!resumed)
cached_cost = 0 cached_cost = 0
process_atmos_machinery(delta_time, resumed) process_atmos_machinery(resumed)
cached_cost += TICK_USAGE_REAL - timer cached_cost += TICK_USAGE_REAL - timer
if(state != SS_RUNNING) if(state != SS_RUNNING)
return return
@@ -139,7 +138,7 @@ SUBSYSTEM_DEF(air)
timer = TICK_USAGE_REAL timer = TICK_USAGE_REAL
if(!resumed) if(!resumed)
cached_cost = 0 cached_cost = 0
process_hotspots(delta_time, resumed) process_hotspots(resumed)
cached_cost += TICK_USAGE_REAL - timer cached_cost += TICK_USAGE_REAL - timer
if(state != SS_RUNNING) if(state != SS_RUNNING)
return return
@@ -198,7 +197,7 @@ SUBSYSTEM_DEF(air)
SStgui.update_uis(SSair) //Lightning fast debugging motherfucker SStgui.update_uis(SSair) //Lightning fast debugging motherfucker
/datum/controller/subsystem/air/proc/process_pipenets(delta_time, resumed = FALSE) /datum/controller/subsystem/air/proc/process_pipenets(resumed = FALSE)
if (!resumed) if (!resumed)
src.currentrun = networks.Copy() src.currentrun = networks.Copy()
//cache for sanic speed (lists are references anyways) //cache for sanic speed (lists are references anyways)
@@ -207,7 +206,7 @@ SUBSYSTEM_DEF(air)
var/datum/thing = currentrun[currentrun.len] var/datum/thing = currentrun[currentrun.len]
currentrun.len-- currentrun.len--
if(thing) if(thing)
thing.process(delta_time) thing.process()
else else
networks.Remove(thing) networks.Remove(thing)
if(MC_TICK_CHECK) if(MC_TICK_CHECK)
@@ -231,7 +230,7 @@ SUBSYSTEM_DEF(air)
if(MC_TICK_CHECK) if(MC_TICK_CHECK)
return return
/datum/controller/subsystem/air/proc/process_atmos_machinery(delta_time, resumed = FALSE) /datum/controller/subsystem/air/proc/process_atmos_machinery(resumed = FALSE)
if (!resumed) if (!resumed)
src.currentrun = atmos_machinery.Copy() src.currentrun = atmos_machinery.Copy()
//cache for sanic speed (lists are references anyways) //cache for sanic speed (lists are references anyways)
@@ -239,7 +238,7 @@ SUBSYSTEM_DEF(air)
while(currentrun.len) while(currentrun.len)
var/obj/machinery/M = currentrun[currentrun.len] var/obj/machinery/M = currentrun[currentrun.len]
currentrun.len-- currentrun.len--
if(!M || (M.process_atmos(delta_time) == PROCESS_KILL)) if(!M || (M.process_atmos() == PROCESS_KILL))
atmos_machinery.Remove(M) atmos_machinery.Remove(M)
if(MC_TICK_CHECK) if(MC_TICK_CHECK)
return return
@@ -257,7 +256,7 @@ SUBSYSTEM_DEF(air)
if(MC_TICK_CHECK) if(MC_TICK_CHECK)
return return
/datum/controller/subsystem/air/proc/process_hotspots(delta_time, resumed = FALSE) /datum/controller/subsystem/air/proc/process_hotspots(resumed = FALSE)
if (!resumed) if (!resumed)
src.currentrun = hotspots.Copy() src.currentrun = hotspots.Copy()
//cache for sanic speed (lists are references anyways) //cache for sanic speed (lists are references anyways)
@@ -266,7 +265,7 @@ SUBSYSTEM_DEF(air)
var/obj/effect/hotspot/H = currentrun[currentrun.len] var/obj/effect/hotspot/H = currentrun[currentrun.len]
currentrun.len-- currentrun.len--
if (H) if (H)
H.process(delta_time) H.process()
else else
hotspots -= H hotspots -= H
if(MC_TICK_CHECK) if(MC_TICK_CHECK)

View File

@@ -51,7 +51,7 @@
/obj/machinery/atmospherics/components/binary/volume_pump/update_icon_nopipes() /obj/machinery/atmospherics/components/binary/volume_pump/update_icon_nopipes()
icon_state = on && is_operational ? "volpump_on-[set_overlay_offset(piping_layer)]" : "volpump_off-[set_overlay_offset(piping_layer)]" icon_state = on && is_operational ? "volpump_on-[set_overlay_offset(piping_layer)]" : "volpump_off-[set_overlay_offset(piping_layer)]"
/obj/machinery/atmospherics/components/binary/volume_pump/process_atmos(delta_time) /obj/machinery/atmospherics/components/binary/volume_pump/process_atmos()
if(!on || !is_operational) if(!on || !is_operational)
return return
@@ -70,14 +70,14 @@
return return
var/transfer_ratio = (transfer_rate * delta_time) / air1.volume var/transfer_ratio = transfer_rate / air1.volume
var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio)
if(overclocked)//Some of the gas from the mixture leaks to the environment when overclocked if(overclocked)//Some of the gas from the mixture leaks to the environment when overclocked
var/turf/open/T = loc var/turf/open/T = loc
if(istype(T)) if(istype(T))
var/datum/gas_mixture/leaked = removed.remove_ratio(DT_PROB_RATE(VOLUME_PUMP_LEAK_AMOUNT, delta_time)) var/datum/gas_mixture/leaked = removed.remove_ratio(VOLUME_PUMP_LEAK_AMOUNT)
T.assume_air(leaked) T.assume_air(leaked)
T.air_update_turf(FALSE, FALSE) T.air_update_turf(FALSE, FALSE)

View File

@@ -19,7 +19,7 @@
var/base_icon = "crystallizer" var/base_icon = "crystallizer"
///Internal Gas mix used for processing the gases that have been put in ///Internal Gas mix used for processing the gases that have been put in
var/datum/gas_mixture/internal var/datum/gas_mixture/internal
///Var that controls how much gas gets injected in moles/S ///Var that controls how much gas gets injected in moles per tick
var/gas_input = 0 var/gas_input = 0
///Saves the progress during the processing of the items ///Saves the progress during the processing of the items
var/progress_bar = 0 var/progress_bar = 0
@@ -115,10 +115,10 @@
return FALSE return FALSE
///Injects the gases from the input inside the internal gasmix, the amount is dependant on the gas_input var ///Injects the gases from the input inside the internal gasmix, the amount is dependant on the gas_input var
/obj/machinery/atmospherics/components/binary/crystallizer/proc/inject_gases(delta_time) /obj/machinery/atmospherics/components/binary/crystallizer/proc/inject_gases()
var/datum/gas_mixture/contents = airs[2] var/datum/gas_mixture/contents = airs[2]
for(var/gas_type in selected_recipe.requirements) for(var/gas_type in selected_recipe.requirements)
internal.merge(contents.remove_specific(gas_type, contents.gases[gas_type][MOLES] * (gas_input * delta_time))) internal.merge(contents.remove_specific(gas_type, contents.gases[gas_type][MOLES] * gas_input))
///Checks if the gases required are all inside ///Checks if the gases required are all inside
/obj/machinery/atmospherics/components/binary/crystallizer/proc/internal_check() /obj/machinery/atmospherics/components/binary/crystallizer/proc/internal_check()
@@ -171,14 +171,14 @@
airs[2].merge(remove) airs[2].merge(remove)
internal.garbage_collect() internal.garbage_collect()
/obj/machinery/atmospherics/components/binary/crystallizer/process_atmos(delta_time) /obj/machinery/atmospherics/components/binary/crystallizer/process_atmos()
if(!on || !is_operational || selected_recipe == null) if(!on || !is_operational || selected_recipe == null)
return return
if(!check_gas_requirements()) if(!check_gas_requirements())
return return
inject_gases(delta_time) inject_gases()
if(!internal.total_moles()) if(!internal.total_moles())
update_parents() update_parents()
@@ -328,7 +328,7 @@
. = TRUE . = TRUE
if("gas_input") if("gas_input")
var/_gas_input = params["gas_input"] var/_gas_input = params["gas_input"]
gas_input = clamp(_gas_input, 0, 500) gas_input = clamp(_gas_input, 0, 250)
update_icon() update_icon()
#undef MIN_PROGRESS_AMOUNT #undef MIN_PROGRESS_AMOUNT

View File

@@ -52,7 +52,7 @@
var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational
icon_state = "filter_[on_state ? "on" : "off"]-[set_overlay_offset(piping_layer)][flipped ? "_f" : ""]" icon_state = "filter_[on_state ? "on" : "off"]-[set_overlay_offset(piping_layer)][flipped ? "_f" : ""]"
/obj/machinery/atmospherics/components/trinary/filter/process_atmos(delta_time) /obj/machinery/atmospherics/components/trinary/filter/process_atmos()
..() ..()
if(!on || !(nodes[1] && nodes[2] && nodes[3]) || !is_operational) if(!on || !(nodes[1] && nodes[2] && nodes[3]) || !is_operational)
return return
@@ -71,7 +71,7 @@
//No need to transfer if target is already full! //No need to transfer if target is already full!
return return
var/transfer_ratio = (transfer_rate * delta_time) / air1.volume var/transfer_ratio = transfer_rate / air1.volume
//Actually transfer the gas //Actually transfer the gas

View File

@@ -270,7 +270,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics
consume_gas = TRUE consume_gas = TRUE
return TRUE return TRUE
/obj/machinery/atmospherics/components/unary/cryo_cell/process_atmos(delta_time) /obj/machinery/atmospherics/components/unary/cryo_cell/process_atmos()
..() ..()
if(!on) if(!on)
@@ -298,8 +298,8 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics
var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * temperature_delta * (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity)) var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * temperature_delta * (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity))
air1.temperature = clamp(air1.temperature - heat * delta_time / air_heat_capacity, TCMB, MAX_TEMPERATURE) air1.temperature = clamp(air1.temperature - heat / air_heat_capacity, TCMB, MAX_TEMPERATURE)
mob_occupant.adjust_bodytemperature(heat * delta_time / heat_capacity, TCMB) mob_occupant.adjust_bodytemperature(heat / heat_capacity, TCMB)
//lets have the core temp match the body temp in humans //lets have the core temp match the body temp in humans
if(ishuman(mob_occupant)) if(ishuman(mob_occupant))
@@ -307,10 +307,10 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics
humi.adjust_coretemperature(humi.bodytemperature - humi.coretemperature) humi.adjust_coretemperature(humi.bodytemperature - humi.coretemperature)
if(consume_gas) // Transferring reagent costs us extra gas if(consume_gas) // Transferring reagent costs us extra gas
air1.gases[/datum/gas/oxygen][MOLES] -= max(0, delta_time / efficiency + 1 / efficiency) // Magically consume gas? Why not, we run on cryo magic. air1.gases[/datum/gas/oxygen][MOLES] -= max(0, 2 / efficiency + 1 / efficiency) // Magically consume gas? Why not, we run on cryo magic.
consume_gas = FALSE consume_gas = FALSE
if(!consume_gas) if(!consume_gas)
air1.gases[/datum/gas/oxygen][MOLES] -= max(0, delta_time / efficiency) air1.gases[/datum/gas/oxygen][MOLES] -= max(0, 2 / efficiency)
air1.garbage_collect() air1.garbage_collect()
if(air1.temperature > 2000) if(air1.temperature > 2000)

View File

@@ -13,7 +13,7 @@
var/injecting = 0 var/injecting = 0
var/volume_rate = 100 var/volume_rate = 50
var/frequency = 0 var/frequency = 0
var/id = null var/id = null
@@ -53,7 +53,7 @@
else else
icon_state = "inje_on" icon_state = "inje_on"
/obj/machinery/atmospherics/components/unary/outlet_injector/process_atmos(delta_time) /obj/machinery/atmospherics/components/unary/outlet_injector/process_atmos()
..() ..()
injecting = 0 injecting = 0
@@ -64,7 +64,7 @@
var/datum/gas_mixture/air_contents = airs[1] var/datum/gas_mixture/air_contents = airs[1]
if(air_contents.temperature > 0) if(air_contents.temperature > 0)
var/transfer_moles = (air_contents.return_pressure() * volume_rate * delta_time) / (air_contents.temperature * R_IDEAL_GAS_EQUATION) var/transfer_moles = (air_contents.return_pressure() * volume_rate) / (air_contents.temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)

View File

@@ -18,7 +18,7 @@
var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing
var/filter_types = list(/datum/gas/carbon_dioxide) var/filter_types = list(/datum/gas/carbon_dioxide)
var/volume_rate = 400 var/volume_rate = 200
var/widenet = 0 //is this scrubber acting on the 3x3 area around it. var/widenet = 0 //is this scrubber acting on the 3x3 area around it.
var/list/turf/adjacent_turfs = list() var/list/turf/adjacent_turfs = list()
@@ -136,20 +136,20 @@
check_turfs() check_turfs()
..() ..()
/obj/machinery/atmospherics/components/unary/vent_scrubber/process_atmos(delta_time) /obj/machinery/atmospherics/components/unary/vent_scrubber/process_atmos()
..() ..()
if(welded || !is_operational) if(welded || !is_operational)
return FALSE return FALSE
if(!nodes[1] || !on) if(!nodes[1] || !on)
on = FALSE on = FALSE
return FALSE return FALSE
scrub(loc, delta_time) scrub(loc)
if(widenet) if(widenet)
for(var/turf/tile in adjacent_turfs) for(var/turf/tile in adjacent_turfs)
scrub(tile, delta_time) scrub(tile)
return TRUE return TRUE
/obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(turf/tile, delta_time = 0.5) /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(turf/tile)
if(!istype(tile)) if(!istype(tile))
return FALSE return FALSE
var/datum/gas_mixture/environment = tile.return_air() var/datum/gas_mixture/environment = tile.return_air()
@@ -161,7 +161,7 @@
if(scrubbing & SCRUBBING) if(scrubbing & SCRUBBING)
if(length(env_gases & filter_types)) if(length(env_gases & filter_types))
var/transfer_moles = min(1, volume_rate * delta_time / environment.volume)*environment.total_moles() var/transfer_moles = min(1, volume_rate / environment.volume) * environment.total_moles()
//Take a gas sample //Take a gas sample
var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
@@ -191,7 +191,7 @@
else //Just siphoning all air else //Just siphoning all air
var/transfer_moles = environment.total_moles() * (volume_rate * delta_time / environment.volume) var/transfer_moles = environment.total_moles() * (volume_rate / environment.volume)
var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)

View File

@@ -474,7 +474,7 @@
else if(valve_open && holding) else if(valve_open && holding)
investigate_log("[key_name(user)] started a transfer into [holding].", INVESTIGATE_ATMOS) investigate_log("[key_name(user)] started a transfer into [holding].", INVESTIGATE_ATMOS)
/obj/machinery/portable_atmospherics/canister/process_atmos(delta_time) /obj/machinery/portable_atmospherics/canister/process_atmos()
. = ..() . = ..()
if(machine_stat & BROKEN) if(machine_stat & BROKEN)
return PROCESS_KILL return PROCESS_KILL
@@ -495,7 +495,7 @@
///function used to check the limit of the canisters and also set the amount of damage that the canister can receive, if the heat and pressure are way higher than the limit the more damage will be done ///function used to check the limit of the canisters and also set the amount of damage that the canister can receive, if the heat and pressure are way higher than the limit the more damage will be done
if(our_temperature > heat_limit || our_pressure > pressure_limit) if(our_temperature > heat_limit || our_pressure > pressure_limit)
take_damage(clamp((our_temperature/heat_limit) * (our_pressure/pressure_limit) * delta_time * 2, 5, 50), BURN, 0) take_damage(clamp((our_temperature/heat_limit) * (our_pressure/pressure_limit), 5, 50), BURN, 0)
update_appearance() update_appearance()
/obj/machinery/portable_atmospherics/canister/ui_state(mob/user) /obj/machinery/portable_atmospherics/canister/ui_state(mob/user)

View File

@@ -44,13 +44,13 @@
if(connected_port) if(connected_port)
. += "siphon-connector" . += "siphon-connector"
/obj/machinery/portable_atmospherics/pump/process_atmos(delta_time) /obj/machinery/portable_atmospherics/pump/process_atmos()
. = ..() . = ..()
var/pressure = air_contents.return_pressure() var/pressure = air_contents.return_pressure()
var/temperature = air_contents.return_temperature() var/temperature = air_contents.return_temperature()
///function used to check the limit of the pumps and also set the amount of damage that the pump can receive, if the heat and pressure are way higher than the limit the more damage will be done ///function used to check the limit of the pumps and also set the amount of damage that the pump can receive, if the heat and pressure are way higher than the limit the more damage will be done
if(temperature > heat_limit || pressure > pressure_limit) if(temperature > heat_limit || pressure > pressure_limit)
take_damage(clamp((temperature/heat_limit) * (pressure/pressure_limit) * delta_time * 0.5, 5, 50), BURN, 0) take_damage(clamp((temperature/heat_limit) * (pressure/pressure_limit), 5, 50), BURN, 0)
return return
if(!on) if(!on)

View File

@@ -12,7 +12,7 @@
///Is the machine on? ///Is the machine on?
var/on = FALSE var/on = FALSE
///the rate the machine will scrub air ///the rate the machine will scrub air
var/volume_rate = 500 var/volume_rate = 1000
///Multiplier with ONE_ATMOSPHERE, if the enviroment pressure is higher than that, the scrubber won't work ///Multiplier with ONE_ATMOSPHERE, if the enviroment pressure is higher than that, the scrubber won't work
var/overpressure_m = 80 var/overpressure_m = 80
///Should the machine use overlay in update_overlays() when open/close? ///Should the machine use overlay in update_overlays() when open/close?
@@ -54,7 +54,7 @@
if(connected_port) if(connected_port)
. += "scrubber-connector" . += "scrubber-connector"
/obj/machinery/portable_atmospherics/scrubber/process_atmos(delta_time) /obj/machinery/portable_atmospherics/scrubber/process_atmos()
. = ..() . = ..()
var/pressure = air_contents.return_pressure() var/pressure = air_contents.return_pressure()
var/temperature = air_contents.return_temperature() var/temperature = air_contents.return_temperature()
@@ -67,22 +67,21 @@
return return
if(holding) if(holding)
scrub(holding.air_contents, delta_time) scrub(holding.air_contents)
else else
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
scrub(T.return_air(), delta_time) scrub(T.return_air())
/** /**
* Called in process_atmos(), handles the scrubbing of the given gas_mixture * Called in process_atmos(), handles the scrubbing of the given gas_mixture
* Arguments: * Arguments:
* * mixture: the gas mixture to be scrubbed * * mixture: the gas mixture to be scrubbed
* * delta_time: multiplier for transfer_moles that depends on the time between ticks
*/ */
/obj/machinery/portable_atmospherics/scrubber/proc/scrub(datum/gas_mixture/mixture, delta_time = 2) /obj/machinery/portable_atmospherics/scrubber/proc/scrub(datum/gas_mixture/mixture)
if(air_contents.return_pressure() >= overpressure_m * ONE_ATMOSPHERE) if(air_contents.return_pressure() >= overpressure_m * ONE_ATMOSPHERE)
return return
var/transfer_moles = min(1, volume_rate * delta_time / mixture.volume) * mixture.total_moles() var/transfer_moles = min(1, volume_rate / mixture.volume) * mixture.total_moles()
var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter. var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter.
var/datum/gas_mixture/filtered = new var/datum/gas_mixture/filtered = new
@@ -188,7 +187,7 @@
icon_state = "scrubber:[on]" icon_state = "scrubber:[on]"
return ..() return ..()
/obj/machinery/portable_atmospherics/scrubber/huge/process_atmos(delta_time) /obj/machinery/portable_atmospherics/scrubber/huge/process_atmos()
if((!anchored && !movable) || !is_operational) if((!anchored && !movable) || !is_operational)
on = FALSE on = FALSE
update_appearance() update_appearance()
@@ -200,7 +199,7 @@
if(!holding) if(!holding)
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
for(var/turf/AT in T.GetAtmosAdjacentTurfs(alldir = TRUE)) for(var/turf/AT in T.GetAtmosAdjacentTurfs(alldir = TRUE))
scrub(AT.return_air(), delta_time) scrub(AT.return_air())
/obj/machinery/portable_atmospherics/scrubber/huge/attackby(obj/item/W, mob/user) /obj/machinery/portable_atmospherics/scrubber/huge/attackby(obj/item/W, mob/user)
if(default_unfasten_wrench(user, W)) if(default_unfasten_wrench(user, W))

View File

@@ -47,7 +47,7 @@ export const Crystallizer = (props, context) => {
width="63px" width="63px"
unit="moles/s" unit="moles/s"
minValue={0} minValue={0}
maxValue={500} maxValue={250}
onDrag={(e, value) => act('gas_input', { onDrag={(e, value) => act('gas_input', {
gas_input: value, gas_input: value,
})} /> })} />