diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index 75111a8b342..94cc2751c27 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -49,7 +49,6 @@ var/icy = 0 var/icyoverlay var/obj/effect/hotspot/active_hotspot - var/atmos_cooldown = 0 var/planetary_atmos = FALSE //air will revert to its initial mix over time var/temperature_archived //USED ONLY FOR SOLIDS @@ -146,10 +145,8 @@ var/remove = 1 //set by non simulated turfs who are sharing with this turf - atmos_cooldown++ - var/planet_atmos = planetary_atmos - if(planet_atmos) + if (planet_atmos) atmos_adjacent_turfs_amount++ for(var/direction in cardinal) @@ -173,22 +170,22 @@ excited_group.merge_groups(enemy_simulated.excited_group) //combine groups share_air(enemy_simulated) //share else - if((recently_active == 1 && enemy_simulated.recently_active == 1) || air.compare(enemy_simulated.air)) + if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air)) excited_group.add_turf(enemy_simulated) //add enemy to our group share_air(enemy_simulated) //share else if(enemy_simulated.excited_group) - if((recently_active == 1 && enemy_simulated.recently_active == 1) || air.compare(enemy_simulated.air)) + if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air)) enemy_simulated.excited_group.add_turf(src) //join self to enemy group share_air(enemy_simulated) //share else - if((recently_active == 1 && enemy_simulated.recently_active == 1) || air.compare(enemy_simulated.air)) + if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air)) var/datum/excited_group/EG = new //generate new group EG.add_turf(src) EG.add_turf(enemy_simulated) share_air(enemy_simulated) //share else - if(air.compare(enemy_simulated.air)) //compare if + if(!air.compare(enemy_simulated.air)) //compare if SSair.add_to_active(enemy_simulated) //excite enemy if(excited_group) excited_group.add_turf(enemy_simulated) //add enemy to group @@ -201,7 +198,7 @@ /******************* GROUP HANDLING FINISH *********************************************************************/ else - if(air.check_turf(enemy_tile, atmos_adjacent_turfs_amount)) + if(!air.check_turf(enemy_tile, atmos_adjacent_turfs_amount)) var/difference = air.mimic(enemy_tile,atmos_adjacent_turfs_amount) if(difference) if(difference > 0) @@ -237,8 +234,6 @@ if(consider_superconductivity(starting = 1)) remove = 0 - if(atmos_cooldown > EXCITED_GROUP_DISMANTLE_CYCLES*2) - SSair.remove_from_active(src) if(!excited_group && remove == 1) SSair.remove_from_active(src) @@ -301,10 +296,6 @@ /turf/simulated/proc/last_share_check() if(air.last_share > MINIMUM_AIR_TO_SUSPEND) excited_group.reset_cooldowns() - atmos_cooldown = 0 - else if(air.last_share > MINIMUM_MOLES_DELTA_TO_MOVE) - excited_group.dismantle_cooldown = 0 - atmos_cooldown = 0 /turf/proc/high_pressure_movements() var/atom/movable/M @@ -337,7 +328,6 @@ /datum/excited_group var/list/turf_list = list() var/breakdown_cooldown = 0 - var/dismantle_cooldown = 0 /datum/excited_group/New() if(SSair) @@ -365,33 +355,38 @@ /datum/excited_group/proc/reset_cooldowns() breakdown_cooldown = 0 - dismantle_cooldown = 0 /datum/excited_group/proc/self_breakdown() var/datum/gas_mixture/A = new + var/datum/gas/sleeping_agent/S = new + A.trace_gases += S + for(var/turf/simulated/T in turf_list) + A.oxygen += T.air.oxygen + A.carbon_dioxide+= T.air.carbon_dioxide + A.nitrogen += T.air.nitrogen + A.toxins += T.air.toxins - //make local for sanic speed - var/list/turf_list = src.turf_list - var/turflen = turf_list.len + if(T.air.trace_gases.len) + for(var/datum/gas/N in T.air.trace_gases) + S.moles += N.moles for(var/turf/simulated/T in turf_list) - A.merge(T.air) + T.air.oxygen = A.oxygen/turf_list.len + T.air.carbon_dioxide= A.carbon_dioxide/turf_list.len + T.air.nitrogen = A.nitrogen/turf_list.len + T.air.toxins = A.toxins/turf_list.len - A.oxygen = A.oxygen /turflen - A.carbon_dioxide= A.carbon_dioxide /turflen - A.nitrogen = A.nitrogen /turflen - A.toxins = A.toxins /turflen - if(A.trace_gases.len) - for(var/datum/gas/G in A.trace_gases) - G.moles = G.moles / turflen + if(S.moles > 0) + if(T.air.trace_gases.len) + for(var/datum/gas/G in T.air.trace_gases) + G.moles = S.moles/turf_list.len + else + var/datum/gas/sleeping_agent/G = new + G.moles = S.moles/turf_list.len + T.air.trace_gases += G - for(var/turf/simulated/T in turf_list) - T.air.copy_from(A) - T.atmos_cooldown = 0 T.update_visuals() - breakdown_cooldown = 0 - /datum/excited_group/proc/dismantle() for(var/turf/simulated/T in turf_list) @@ -510,11 +505,11 @@ turf/simulated/proc/radiate_to_spess() //Radiate excess tile heat to space var/turf/enemy_tile = get_step(src, direction) if(istype(enemy_tile, /turf/simulated)) var/turf/simulated/enemy_simulated = enemy_tile - if(air.compare(enemy_simulated.air)) + if(!air.compare(enemy_simulated.air)) excited = 1 SSair.active_turfs |= src break else - if(air.check_turf_total(enemy_tile)) + if(!air.check_turf_total(enemy_tile)) excited = 1 - SSair.active_turfs |= src \ No newline at end of file + SSair.active_turfs |= src diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 9e633e36077..2f296960622 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -25,13 +25,11 @@ #define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile //EXCITED GROUPS -#define EXCITED_GROUP_BREAKDOWN_CYCLES 4 //number of FULL air controller ticks before an excited group breaks down (averages gas contents across turfs) -#define EXCITED_GROUP_DISMANTLE_CYCLES 16 //number of FULL air controller ticks before an excited group dismantles and removes its turfs from active -#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.1 //Ratio of air that must move to/from a tile to reset group processing -#define MINIMUM_AIR_RATIO_TO_MOVE 0.001 //Minimum ratio of air that must move to/from a tile +#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.005 //Minimum ratio of air that must move to/from a tile to suspend group processing #define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Minimum amount of air that has to move before a group processing can be suspended -#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_MOVE) //Either this must be active +#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Either this must be active #define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) //or this (or both, obviously) +#define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 #define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 //Minimum temperature difference before group processing is suspended #define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 //Minimum temperature difference before the gas temperatures are just set to be equal #define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C+10) diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index f4a165f10fe..fe48494f321 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -249,10 +249,9 @@ SUBSYSTEM_DEF(air) var/datum/excited_group/EG = currentrun[currentrun.len] currentrun.len-- EG.breakdown_cooldown++ - EG.dismantle_cooldown++ - if(EG.breakdown_cooldown >= EXCITED_GROUP_BREAKDOWN_CYCLES) + if(EG.breakdown_cooldown == 10) EG.self_breakdown() - else if(EG.dismantle_cooldown >= EXCITED_GROUP_DISMANTLE_CYCLES) + else if(EG.breakdown_cooldown >= 20) EG.dismantle() if(MC_TICK_CHECK) return diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index 06e35cd062e..35cc970aa67 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -368,20 +368,20 @@ What are the archived variables for? var/delta_temperature = (temperature_archived - model.temperature) - if(((abs(delta_oxygen) > MINIMUM_MOLES_DELTA_TO_MOVE) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_MOVE)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_MOLES_DELTA_TO_MOVE) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_MOVE)) \ - || ((abs(delta_nitrogen) > MINIMUM_MOLES_DELTA_TO_MOVE) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_MOVE)) \ - || ((abs(delta_toxins) > MINIMUM_MOLES_DELTA_TO_MOVE) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_MOVE))) - return TRUE + if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) + return 0 if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return TRUE + return 0 for(var/gas in trace_gases) var/datum/gas/trace_gas = gas - if(trace_gas.moles_archived > MINIMUM_MOLES_DELTA_TO_MOVE*4) - return TRUE + if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) + return 0 - return FALSE + return 1 /datum/gas_mixture/proc/check_turf_total(turf/model) //I want this proc to die a painful death var/delta_oxygen = (oxygen - model.oxygen) @@ -391,20 +391,20 @@ What are the archived variables for? var/delta_temperature = (temperature - model.temperature) - if(((abs(delta_oxygen) > MINIMUM_MOLES_DELTA_TO_MOVE) && (abs(delta_oxygen) >= oxygen*MINIMUM_AIR_RATIO_TO_MOVE)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_MOLES_DELTA_TO_MOVE) && (abs(delta_carbon_dioxide) >= carbon_dioxide*MINIMUM_AIR_RATIO_TO_MOVE)) \ - || ((abs(delta_nitrogen) > MINIMUM_MOLES_DELTA_TO_MOVE) && (abs(delta_nitrogen) >= nitrogen*MINIMUM_AIR_RATIO_TO_MOVE)) \ - || ((abs(delta_toxins) > MINIMUM_MOLES_DELTA_TO_MOVE) && (abs(delta_toxins) >= toxins*MINIMUM_AIR_RATIO_TO_MOVE))) - return TRUE + if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins*MINIMUM_AIR_RATIO_TO_SUSPEND))) + return 0 if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return TRUE + return 0 for(var/gas in trace_gases) var/datum/gas/trace_gas = gas - if(trace_gas.moles > MINIMUM_MOLES_DELTA_TO_MOVE*4) - return TRUE + if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND*4) + return 0 - return FALSE + return 1 /datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) if(!sharer) return 0 @@ -638,53 +638,46 @@ What are the archived variables for? sharer.temperature += heat/sharer.heat_capacity /datum/gas_mixture/compare(datum/gas_mixture/sample) - var/delta = abs(oxygen - sample.oxygen) - if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && delta > oxygen * MINIMUM_AIR_RATIO_TO_MOVE) - return TRUE + if((abs(oxygen-sample.oxygen) > MINIMUM_AIR_TO_SUSPEND) && \ + ((oxygen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen))) + return 0 + if((abs(nitrogen-sample.nitrogen) > MINIMUM_AIR_TO_SUSPEND) && \ + ((nitrogen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen) || (nitrogen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen))) + return 0 + if((abs(carbon_dioxide-sample.carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && \ + ((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide))) + return 0 + if((abs(toxins-sample.toxins) > MINIMUM_AIR_TO_SUSPEND) && \ + ((toxins < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins) || (toxins > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins))) + return 0 - delta = abs(nitrogen - sample.nitrogen) - if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && delta > nitrogen * MINIMUM_AIR_RATIO_TO_MOVE) - return TRUE - - delta = abs(carbon_dioxide - sample.carbon_dioxide) - if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && delta > carbon_dioxide * MINIMUM_AIR_RATIO_TO_MOVE) - return TRUE - - delta = abs(toxins - sample.toxins) - if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && delta > toxins * MINIMUM_AIR_RATIO_TO_MOVE) - return TRUE - - if(total_moles() > MINIMUM_MOLES_DELTA_TO_MOVE) - var/temp = temperature - var/sample_temp = sample.temperature - - var/temperature_delta = abs(temp - sample_temp) - if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return TRUE - - for(var/gas in trace_gases) - var/datum/gas/trace_gas = gas - var/datum/gas/corresponding = locate(trace_gas.type) in sample.trace_gases - if(corresponding) - delta = abs(trace_gas.moles - corresponding.moles) - if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && delta > trace_gas.moles * MINIMUM_AIR_RATIO_TO_MOVE) - return TRUE - else - if(trace_gas.moles > MINIMUM_MOLES_DELTA_TO_MOVE) - return TRUE + if(total_moles() > MINIMUM_AIR_TO_SUSPEND) + if((abs(temperature-sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \ + ((temperature < (1-MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature) || (temperature > (1+MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature))) + return 0 for(var/gas in sample.trace_gases) var/datum/gas/trace_gas = gas - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(corresponding) - delta = abs(trace_gas.moles - corresponding.moles) - if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && delta > trace_gas.moles * MINIMUM_AIR_RATIO_TO_MOVE) - return TRUE - else - if(trace_gas.moles > MINIMUM_MOLES_DELTA_TO_MOVE) - return TRUE + if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND) + var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases + if(corresponding) + if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ + ((corresponding.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles) || (corresponding.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles))) + return 0 + else + return 0 - return FALSE + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) + var/datum/gas/corresponding = locate(trace_gas.type) in sample.trace_gases + if(corresponding) + if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ + ((trace_gas.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles) || (trace_gas.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles))) + return 0 + else + return 0 + return 1 @@ -714,4 +707,4 @@ get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() 10/20*5 = 2.5 10 = 2.5/5*20 -*/ \ No newline at end of file +*/