diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 0e022e3c48..bd3109f4a0 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -50,13 +50,11 @@ atom/movable/RepelAirflowDest(n) vs_control/var - zone_share_percent = 5 - - airflow_lightest_pressure = 35 - airflow_light_pressure = 50 - airflow_medium_pressure = 80 - airflow_heavy_pressure = 100 - airflow_heaviest_pressure = 150 + airflow_lightest_pressure = 15 + airflow_light_pressure = 30 + airflow_medium_pressure = 45 + airflow_heavy_pressure = 60 + airflow_heaviest_pressure = 100 airflow_damage = 0.3 airflow_stun = 0.15 @@ -145,7 +143,7 @@ proc/Airflow(zone/A,zone/B) M.airflow_dest = pick(close_turfs) //Pick a random midpoint to fly towards. - spawn M.GotoAirflowDest(abs(n)/20) + spawn M.GotoAirflowDest(abs(n)/5) //Do it again for the stuff in the other zone, making it fly away. for(var/atom/movable/M in otherpplz) @@ -168,7 +166,7 @@ proc/Airflow(zone/A,zone/B) M.airflow_dest = pick(close_turfs) //Pick a random midpoint to fly towards. - spawn M.RepelAirflowDest(abs(n)/20) + spawn M.RepelAirflowDest(abs(n)/5) proc/AirflowSpace(zone/A) @@ -216,7 +214,7 @@ atom/movable if(airflow_speed < 0) return if(last_airflow > world.time - 150) return if(airflow_speed) - airflow_speed = n + airflow_speed = n/max(get_dist(src,airflow_dest),1) return last_airflow = world.time if(airflow_dest == loc) @@ -265,7 +263,7 @@ atom/movable if(airflow_speed < 0) return if(last_airflow > world.time - 150) return if(airflow_speed) - airflow_speed = n + airflow_speed = n/max(get_dist(src,airflow_dest),1) return last_airflow = world.time if(airflow_dest == loc) diff --git a/code/ZAS/Debug.dm b/code/ZAS/Debug.dm index 66c6a12ca3..7a0285cc1e 100644 --- a/code/ZAS/Debug.dm +++ b/code/ZAS/Debug.dm @@ -32,6 +32,7 @@ zone/proc M << "Pressure: [air.return_pressure()]" M << "" M << "Space Tiles: [length(space_tiles)]" + M << "Movable Objects: [length(movable_objects)]" M << "Connections: [length(connections)]" for(var/connection/C in connections) diff --git a/code/ZAS/Processing.dm b/code/ZAS/Processing.dm index 1770670cf6..48e51767eb 100644 --- a/code/ZAS/Processing.dm +++ b/code/ZAS/Processing.dm @@ -1,6 +1,6 @@ #define QUANTIZE(variable) (round(variable,0.0001)) var/explosion_halt = 0 -var/zone_share_percent = 1 // The amount shared between zones/space at each tick. +var/zone_share_percent = 1 zone proc/process() //Does rebuilding stuff. Not sure if used. @@ -46,13 +46,13 @@ zone if(space_tiles) for(var/T in space_tiles) if(!istype(T,/turf/space)) space_tiles -= T - total_space = length(space_tiles) + total_space++ //Add checks to ensure that we're not sucking air out of an empty room. if(total_space && air.total_moles > 0.1 && air.temperature > TCMB+0.5) //If there is space, air should flow out of the zone. - //if(abs(air.pressure) > vsc.airflow_lightest_pressure) - // AirflowSpace(src) + if(abs(air.pressure) > vsc.airflow_lightest_pressure) + AirflowSpace(src) ShareSpace(air,total_space*(zone_share_percent/100)) //React the air here. @@ -63,7 +63,7 @@ zone air.graphic = 0 if(air.toxins > MOLES_PLASMA_VISIBLE) air.graphic = 1 - else if(length(air.trace_gases)) + else if(air.trace_gases.len) var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air.trace_gases if(sleeping_agent && (sleeping_agent.moles > 1)) air.graphic = 2 @@ -109,8 +109,8 @@ zone for(var/zone/Z in connected_zones) //Ensure we're not doing pointless calculations on equilibrium zones. if(abs(air.total_moles - Z.air.total_moles) > 0.1 || abs(air.temperature - Z.air.temperature) > 0.1) - //if(abs(Z.air.pressure - air.pressure) > vsc.airflow_lightest_pressure) - // Airflow(src,Z) + if(abs(Z.air.pressure - air.pressure) > vsc.airflow_lightest_pressure) + Airflow(src,Z) ShareRatio(air,Z.air,connected_zones[Z]*(zone_share_percent/100)) proc/ShareRatio(datum/gas_mixture/A, datum/gas_mixture/B, ratio) @@ -124,39 +124,35 @@ proc/ShareRatio(datum/gas_mixture/A, datum/gas_mixture/B, ratio) full_co2 = A.carbon_dioxide * size full_plasma = A.toxins * size - full_thermal = A.temperature * A.heat_capacity() * size + full_heat_capacity = A.heat_capacity() * size s_full_oxy = B.oxygen * share_size s_full_nitro = B.nitrogen * share_size s_full_co2 = B.carbon_dioxide * share_size s_full_plasma = B.toxins * share_size - s_full_thermal = B.temperature * B.heat_capacity() * share_size + s_full_heat_capacity = B.heat_capacity() * share_size oxy_avg = (full_oxy + s_full_oxy) / (size + share_size) nit_avg = (full_nitro + s_full_nitro) / (size + share_size) co2_avg = (full_co2 + s_full_co2) / (size + share_size) plasma_avg = (full_plasma + s_full_plasma) / (size + share_size) - thermal_avg = (full_thermal + s_full_thermal) / (size+share_size) + temp_avg = (A.temperature * full_heat_capacity + B.temperature * s_full_heat_capacity) / (full_heat_capacity + s_full_heat_capacity) A.oxygen = (A.oxygen - oxy_avg) * (1-ratio) + oxy_avg A.nitrogen = (A.nitrogen - nit_avg) * (1-ratio) + nit_avg A.carbon_dioxide = (A.carbon_dioxide - co2_avg) * (1-ratio) + co2_avg A.toxins = (A.toxins - plasma_avg) * (1-ratio) + plasma_avg + A.temperature = (A.temperature - temp_avg) * (1-ratio) + temp_avg + B.oxygen = (B.oxygen - oxy_avg) * (1-ratio) + oxy_avg B.nitrogen = (B.nitrogen - nit_avg) * (1-ratio) + nit_avg B.carbon_dioxide = (B.carbon_dioxide - co2_avg) * (1-ratio) + co2_avg B.toxins = (B.toxins - plasma_avg) * (1-ratio) + plasma_avg - var - thermal = (full_thermal/size - thermal_avg) * (1-ratio) + thermal_avg - sharer_thermal = (s_full_thermal/share_size - thermal_avg) * (1-ratio) + thermal_avg - - A.temperature = thermal / (A.heat_capacity() == 0 ? MINIMUM_HEAT_CAPACITY : A.heat_capacity()) - - B.temperature = sharer_thermal / (B.heat_capacity() == 0 ? MINIMUM_HEAT_CAPACITY : B.heat_capacity()) + B.temperature = (B.temperature - temp_avg) * (1-ratio) + temp_avg for(var/datum/gas/G in A.trace_gases) var/datum/gas/H = locate(G.type) in B.trace_gases @@ -178,33 +174,37 @@ proc/ShareRatio(datum/gas_mixture/A, datum/gas_mixture/B, ratio) else return 0 proc/ShareSpace(datum/gas_mixture/A, ratio) - //A modified version of ShareRatio for spacing gas at the same rate as if it were going into a huge airless room. + //A modified version of ShareRatio for spacing gas at the same rate as if it were going into a large airless room. var size = max(1,A.group_multiplier) - share_size = 2000 //A huge value because space is huge. + share_size = max(1,A.group_multiplier) full_oxy = A.oxygen * size full_nitro = A.nitrogen * size full_co2 = A.carbon_dioxide * size full_plasma = A.toxins * size - full_thermal = A.temperature * A.heat_capacity() * size + full_heat_capacity = A.heat_capacity() * size - oxy_avg = (full_oxy + 0) / (size + share_size) - nit_avg = (full_nitro + 0.2) / (size + share_size) - co2_avg = (full_co2 + 0) / (size + share_size) - plasma_avg = (full_plasma + 0) / (size + share_size) + space_heat_capacity = MINIMUM_HEAT_CAPACITY * share_size - thermal_avg = (full_thermal + MINIMUM_HEAT_CAPACITY) / (size+share_size) + oxy_avg = (full_oxy) / (size + share_size) + nit_avg = (full_nitro) / (size + share_size) + co2_avg = (full_co2) / (size + share_size) + plasma_avg = (full_plasma) / (size + share_size) + + temp_avg = (A.temperature * full_heat_capacity + TCMB * space_heat_capacity) / (full_heat_capacity + space_heat_capacity) A.oxygen = (A.oxygen - oxy_avg) * (1-ratio) + oxy_avg A.nitrogen = (A.nitrogen - nit_avg) * (1-ratio) + nit_avg A.carbon_dioxide = (A.carbon_dioxide - co2_avg) * (1-ratio) + co2_avg A.toxins = (A.toxins - plasma_avg) * (1-ratio) + plasma_avg - var/thermal = (full_thermal/size - thermal_avg) * (1-ratio) + thermal_avg + A.temperature = (A.temperature - temp_avg) * (1-ratio) + temp_avg - A.temperature = thermal / (A.heat_capacity() == 0 ? MINIMUM_HEAT_CAPACITY : A.heat_capacity()) + //833 * 0.9 + 833 = + //(5000/3) = 1666 + //(5000/6) = 833 for(var/datum/gas/G in A.trace_gases) var/G_avg = (G.moles*size + 0) / (size+share_size)