From 63860a39b9198cd5794b33e5aebbffb1fa71476b Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 11 Oct 2019 22:31:28 -0400 Subject: [PATCH] Makes LINDA Aggressive --- code/LINDA/LINDA_turf_tile.dm | 67 +++++++++-------- code/__DEFINES/atmospherics.dm | 8 ++- code/controllers/subsystem/air.dm | 5 +- code/datums/gas_mixture.dm | 115 ++++++++++++++++-------------- 4 files changed, 105 insertions(+), 90 deletions(-) diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index 94cc2751c27..75111a8b342 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -49,6 +49,7 @@ 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 @@ -145,8 +146,10 @@ 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) @@ -170,22 +173,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 @@ -198,7 +201,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) @@ -234,6 +237,8 @@ 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) @@ -296,6 +301,10 @@ /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 @@ -328,6 +337,7 @@ /datum/excited_group var/list/turf_list = list() var/breakdown_cooldown = 0 + var/dismantle_cooldown = 0 /datum/excited_group/New() if(SSair) @@ -355,38 +365,33 @@ /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 - if(T.air.trace_gases.len) - for(var/datum/gas/N in T.air.trace_gases) - S.moles += N.moles + //make local for sanic speed + var/list/turf_list = src.turf_list + var/turflen = turf_list.len for(var/turf/simulated/T in turf_list) - 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.merge(T.air) - 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 + 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 + 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) @@ -505,11 +510,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 + SSair.active_turfs |= src \ No newline at end of file diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 2f296960622..9e633e36077 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -25,11 +25,13 @@ #define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile //EXCITED GROUPS -#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.005 //Minimum ratio of air that must move to/from a tile to suspend group processing +#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_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_SUSPEND) //Either this must be active +#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_MOVE) //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 fe48494f321..f4a165f10fe 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -249,9 +249,10 @@ SUBSYSTEM_DEF(air) var/datum/excited_group/EG = currentrun[currentrun.len] currentrun.len-- EG.breakdown_cooldown++ - if(EG.breakdown_cooldown == 10) + EG.dismantle_cooldown++ + if(EG.breakdown_cooldown >= EXCITED_GROUP_BREAKDOWN_CYCLES) EG.self_breakdown() - else if(EG.breakdown_cooldown >= 20) + else if(EG.dismantle_cooldown >= EXCITED_GROUP_DISMANTLE_CYCLES) EG.dismantle() if(MC_TICK_CHECK) return diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index 35cc970aa67..06e35cd062e 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_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_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_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 + return TRUE for(var/gas in trace_gases) var/datum/gas/trace_gas = gas - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - return 0 + if(trace_gas.moles_archived > MINIMUM_MOLES_DELTA_TO_MOVE*4) + return TRUE - return 1 + return FALSE /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_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_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_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 + return TRUE for(var/gas in trace_gases) var/datum/gas/trace_gas = gas - if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND*4) - return 0 + if(trace_gas.moles > MINIMUM_MOLES_DELTA_TO_MOVE*4) + return TRUE - return 1 + return FALSE /datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) if(!sharer) return 0 @@ -638,46 +638,53 @@ What are the archived variables for? sharer.temperature += heat/sharer.heat_capacity /datum/gas_mixture/compare(datum/gas_mixture/sample) - 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 + var/delta = abs(oxygen - sample.oxygen) + if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && delta > oxygen * MINIMUM_AIR_RATIO_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 + delta = abs(nitrogen - sample.nitrogen) + if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && delta > nitrogen * MINIMUM_AIR_RATIO_TO_MOVE) + return TRUE - for(var/gas in sample.trace_gases) - var/datum/gas/trace_gas = gas - 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 + 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 - 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 + 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 + + 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 + + return FALSE @@ -707,4 +714,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