diff --git a/code/ZAS/Connection.dm b/code/ZAS/Connection.dm index ce36a42a9d2..7dc8c655f63 100644 --- a/code/ZAS/Connection.dm +++ b/code/ZAS/Connection.dm @@ -17,7 +17,7 @@ connection zone_B ref_A ref_B - indirect = 0 //If the connection is purely indirect, the zones should not join. + indirect = CONNECTION_DIRECT //If the connection is purely indirect, the zones should not join. last_updated //The tick at which this was last updated. no_zone_count = 0 @@ -47,24 +47,47 @@ connection else air_master.turfs_with_connections[ref_B] = list(src) - if(!A.zone.connected_zones) - A.zone.connected_zones = list() - if(!B.zone.connected_zones) - B.zone.connected_zones = list() + if(A.CanPass(null, B, 0, 0)) - if(B.zone in A.zone.connected_zones) - A.zone.connected_zones[B.zone]++ - else - A.zone.connected_zones += B.zone - A.zone.connected_zones[B.zone] = 1 + if(!A.zone.connected_zones) + A.zone.connected_zones = list() + if(!B.zone.connected_zones) + B.zone.connected_zones = list() + + if(B.zone in A.zone.connected_zones) + A.zone.connected_zones[B.zone]++ + else + A.zone.connected_zones += B.zone + A.zone.connected_zones[B.zone] = 1 + + if(A.zone in B.zone.connected_zones) + B.zone.connected_zones[A.zone]++ + else + B.zone.connected_zones += A.zone + B.zone.connected_zones[A.zone] = 1 - if(A.zone in B.zone.connected_zones) - B.zone.connected_zones[A.zone]++ else - B.zone.connected_zones += A.zone - B.zone.connected_zones[A.zone] = 1 + indirect = CONNECTION_CLOSED + + + if(!A.zone.closed_connection_zones) + A.zone.closed_connection_zones = list() + if(B.zone in A.zone.closed_connection_zones) + A.zone.closed_connection_zones[B.zone]++ + else + A.zone.closed_connection_zones += B.zone + A.zone.closed_connection_zones[B.zone] = 1 + + if(!B.zone.closed_connection_zones) + B.zone.closed_connection_zones = list() + if(A.zone in B.zone.closed_connection_zones) + B.zone.closed_connection_zones[A.zone]++ + else + B.zone.closed_connection_zones += A.zone + B.zone.closed_connection_zones[A.zone] = 1 + if(A.HasDoor(B) || B.HasDoor(A)) - indirect = 1 + indirect = CONNECTION_INDIRECT else world.log << "Attempted to create connection object for non-zone tiles: [T] -> [O]" del(src) @@ -168,6 +191,75 @@ connection zone_B.connected_zones -= zone_A if(zone_B.connected_zones && !zone_B.connected_zones.len) zone_B.connected_zones = null + else + if(A && A.zone) + if(B && B.zone) + if(B.zone in A.zone.closed_connection_zones) + if(A.zone.closed_connection_zones[B.zone] > 1) + A.zone.closed_connection_zones[B.zone]-- + else + A.zone.closed_connection_zones -= B.zone + if(A.zone.closed_connection_zones && !A.zone.closed_connection_zones.len) + A.zone.closed_connection_zones = null + if( zone_B && (!B.zone || zone_B != B.zone) ) + if(zone_B in A.zone.closed_connection_zones) + if(A.zone.closed_connection_zones[zone_B] > 1) + A.zone.closed_connection_zones[zone_B]-- + else + A.zone.closed_connection_zones -= zone_B + if(A.zone.closed_connection_zones && !A.zone.closed_connection_zones.len) + A.zone.closed_connection_zones = null + if(zone_A && (!A.zone || zone_A != A.zone)) + if(B && B.zone) + if(B.zone in zone_A.closed_connection_zones) + if(zone_A.closed_connection_zones[B.zone] > 1) + zone_A.closed_connection_zones[B.zone]-- + else + zone_A.closed_connection_zones -= B.zone + if(zone_A.closed_connection_zones && !zone_A.closed_connection_zones.len) + zone_A.closed_connection_zones = null + if( zone_B && (!B.zone || zone_B != B.zone) ) + if(zone_B in zone_A.closed_connection_zones) + if(zone_A.closed_connection_zones[zone_B] > 1) + zone_A.closed_connection_zones[zone_B]-- + else + zone_A.closed_connection_zones -= zone_B + if(zone_A.closed_connection_zones && !zone_A.closed_connection_zones.len) + zone_A.closed_connection_zones = null + if(B && B.zone) + if(A && A.zone) + if(A.zone in B.zone.closed_connection_zones) + if(B.zone.closed_connection_zones[A.zone] > 1) + B.zone.closed_connection_zones[A.zone]-- + else + B.zone.closed_connection_zones -= A.zone + if(B.zone.closed_connection_zones && !B.zone.closed_connection_zones.len) + B.zone.closed_connection_zones = null + if( zone_A && (!A.zone || zone_A != A.zone) ) + if(zone_A in B.zone.closed_connection_zones) + if(B.zone.closed_connection_zones[zone_A] > 1) + B.zone.closed_connection_zones[zone_A]-- + else + B.zone.closed_connection_zones -= zone_A + if(B.zone.closed_connection_zones && !B.zone.closed_connection_zones.len) + B.zone.closed_connection_zones = null + if(zone_B && (!B.zone || zone_B != B.zone)) + if(A && A.zone) + if(A.zone in zone_B.closed_connection_zones) + if(zone_B.closed_connection_zones[A.zone] > 1) + zone_B.closed_connection_zones[A.zone]-- + else + zone_B.closed_connection_zones -= A.zone + if(zone_B.closed_connection_zones && !zone_B.closed_connection_zones.len) + zone_B.closed_connection_zones = null + if( zone_A && (!A.zone || zone_A != A.zone) ) + if(zone_A in zone_B.closed_connection_zones) + if(zone_B.closed_connection_zones[zone_A] > 1) + zone_B.closed_connection_zones[zone_A]-- + else + zone_B.closed_connection_zones -= zone_A + if(zone_B.closed_connection_zones && !zone_B.closed_connection_zones.len) + zone_B.closed_connection_zones = null . = ..() proc/Cleanup() @@ -212,12 +304,32 @@ connection else B.zone.connected_zones += A.zone B.zone.connected_zones[A.zone] = 1 + + if(A.zone.closed_connection_zones) + if(A.zone.closed_connection_zones[B.zone] > 1) + A.zone.closed_connection_zones[B.zone]-- + else + A.zone.closed_connection_zones.Remove(B.zone) + if(A.zone.closed_connection_zones && !A.zone.closed_connection_zones.len) + A.zone.closed_connection_zones = null + + if(B.zone.closed_connection_zones) + if(B.zone.closed_connection_zones[A.zone] > 1) + B.zone.closed_connection_zones[A.zone]-- + else + B.zone.closed_connection_zones.Remove(A.zone) + + if(B.zone.closed_connection_zones && !B.zone.closed_connection_zones.len) + B.zone.closed_connection_zones = null + if(door_pass) indirect = CONNECTION_DIRECT else if(!door_pass) indirect = CONNECTION_INDIRECT + else if(indirect > CONNECTION_CLOSED) indirect = CONNECTION_CLOSED + //ADJUST FOR CANNOT CONNECT if(A.zone.connected_zones) if(A.zone.connected_zones[B.zone] > 1) @@ -226,13 +338,33 @@ connection A.zone.connected_zones.Remove(B.zone) if(A.zone.connected_zones && !A.zone.connected_zones.len) A.zone.connected_zones = null + if(B.zone.connected_zones) if(B.zone.connected_zones[A.zone] > 1) B.zone.connected_zones[A.zone]-- else B.zone.connected_zones.Remove(A.zone) + if(B.zone.connected_zones && !B.zone.connected_zones.len) B.zone.connected_zones = null + + //Add to the closed connections list(s) + if(!A.zone.closed_connection_zones) + A.zone.closed_connection_zones = list() + if(B.zone in A.zone.closed_connection_zones) + A.zone.closed_connection_zones[B.zone]++ + else + A.zone.closed_connection_zones += B.zone + A.zone.closed_connection_zones[B.zone] = 1 + + if(!B.zone.closed_connection_zones) + B.zone.closed_connection_zones = list() + if(A.zone in B.zone.closed_connection_zones) + B.zone.closed_connection_zones[A.zone]++ + else + B.zone.closed_connection_zones += A.zone + B.zone.closed_connection_zones[A.zone] = 1 + else //If I can no longer pass air, better delete del src @@ -268,6 +400,16 @@ connection if(zone_A.connected_zones && !zone_A.connected_zones.len) zone_A.connected_zones = null + else + if(zone_A.closed_connection_zones) + if(zone_A.closed_connection_zones[zone_B] > 1) + zone_A.closed_connection_zones[zone_B]-- + else + zone_A.closed_connection_zones.Remove(zone_B) + if(zone_A.closed_connection_zones && !zone_A.closed_connection_zones.len) + zone_A.closed_connection_zones = null + + if(zone_B) if(zone_B.connections) zone_B.connections.Remove(src) @@ -283,6 +425,15 @@ connection if(zone_B.connected_zones && !zone_B.connected_zones.len) zone_B.connected_zones = null + else + if(zone_B.closed_connection_zones) + if(zone_B.closed_connection_zones[zone_A] > 1) + zone_B.closed_connection_zones[zone_A]-- + else + zone_B.closed_connection_zones.Remove(zone_A) + if(zone_B.closed_connection_zones && !zone_B.closed_connection_zones.len) + zone_B.closed_connection_zones = null + if(indirect != CONNECTION_CLOSED) if(!A.zone.connections) A.zone.connections = list() @@ -307,6 +458,31 @@ connection B.zone.connected_zones += A.zone B.zone.connected_zones[A.zone] = 1 + else + + if(!A.zone.connections) + A.zone.connections = list() + A.zone.connections |= src + if(!B.zone.connections) + B.zone.connections = list() + B.zone.connections |= src + + if(!A.zone.closed_connection_zones) + A.zone.closed_connection_zones = list() + if(B.zone in A.zone.closed_connection_zones) + A.zone.closed_connection_zones[B.zone]++ + else + A.zone.closed_connection_zones += B.zone + A.zone.closed_connection_zones[B.zone] = 1 + + if(!B.zone.closed_connection_zones) + B.zone.closed_connection_zones = list() + if(A.zone in B.zone.closed_connection_zones) + B.zone.closed_connection_zones[A.zone]++ + else + B.zone.closed_connection_zones += A.zone + B.zone.closed_connection_zones[A.zone] = 1 + zone_B = B.zone zone_A = A.zone @@ -340,6 +516,23 @@ connection else A.zone.connected_zones[zone_B]++ + else + if(zone_A.closed_connection_zones) + if(zone_A.closed_connection_zones[zone_B] > 1) + zone_A.closed_connection_zones[zone_B]-- + else + zone_A.closed_connection_zones.Remove(zone_B) + if(zone_A.closed_connection_zones && !zone_A.closed_connection_zones.len) + zone_A.closed_connection_zones = null + + if(!A.zone.closed_connection_zones) + A.zone.closed_connection_zones = list() + if(!(zone_B in A.zone.closed_connection_zones)) + A.zone.closed_connection_zones += zone_B + A.zone.closed_connection_zones[zone_B] = 1 + else + A.zone.closed_connection_zones[zone_B]++ + zone_A = A.zone else @@ -373,6 +566,23 @@ connection else B.zone.connected_zones[zone_A]++ + else + if(zone_B.closed_connection_zones) + if(zone_B.closed_connection_zones[zone_A] > 1) + zone_B.closed_connection_zones[zone_A]-- + else + zone_B.closed_connection_zones.Remove(zone_A) + if(zone_B.closed_connection_zones && !zone_B.closed_connection_zones.len) + zone_B.closed_connection_zones = null + + if(!B.zone.closed_connection_zones) + B.zone.closed_connection_zones = list() + if(!(zone_A in B.zone.closed_connection_zones)) + B.zone.closed_connection_zones += zone_A + B.zone.closed_connection_zones[zone_A] = 1 + else + B.zone.closed_connection_zones[zone_A]++ + zone_B = B.zone else diff --git a/code/ZAS/Functions.dm b/code/ZAS/Functions.dm index e7847bb2bd3..176545af585 100644 --- a/code/ZAS/Functions.dm +++ b/code/ZAS/Functions.dm @@ -126,8 +126,6 @@ proc/ZConnect(turf/simulated/A,turf/simulated/B) if(!A.zone || !B.zone) return if(A.zone == B.zone) return - if(!A.CanPass(null,B,0,0)) return - if(A.CanPass(null,B,0,1)) return ZMerge(A.zone,B.zone) diff --git a/code/ZAS/ZAS_Turfs.dm b/code/ZAS/ZAS_Turfs.dm index 8ac742a6c6a..b6ebe6bd500 100644 --- a/code/ZAS/ZAS_Turfs.dm +++ b/code/ZAS/ZAS_Turfs.dm @@ -181,38 +181,9 @@ turf // var/list/zone/adjacent_zones = list() if(air_check_directions&direction) //I can connect air in this direction - if(!CanPass(null, T, 0, 0)) //If either block air, we must look to see if the adjacent turfs need rebuilt. - if(!T.CanPass(null, T, 0, 0)) //Target blocks air - var/turf/NT = get_step(T, direction) - if(istype(NT,/turf/simulated) && NT in zone.contents) - air_master.AddToConsiderRebuild(src,NT) - else if(istype(NT) && NT in zone.unsimulated_tiles) - var/consider_rebuild = 0 - for(var/d in cardinal) - var/turf/UT = get_step(NT,d) - if(istype(UT, /turf/simulated) && UT.zone == zone && UT.CanPass(null, NT, 0, 0)) //If we find a neighboring tile that is in the same zone, check if we need to rebuild - consider_rebuild = 1 - break - if(consider_rebuild) - air_master.AddToConsiderRebuild(src,NT) //Gotta check if we need to rebuild, dammit - else - zone.RemoveTurf(NT) //Not adjacent to anything, and unsimulated. Goodbye~ - - if(T.zone && !T.zone.rebuild) //I block air. - var/turf/NT = get_step(src, reverse_direction(direction)) - if(istype(NT,/turf/simulated) && (NT in T.zone.contents || (NT.zone && T in NT.zone.contents))) - air_master.AddToConsiderRebuild(T,NT) - else if(istype(NT) && NT in T.zone.unsimulated_tiles) - var/consider_rebuild = 0 - for(var/d in cardinal) - var/turf/UT = get_step(NT,d) - if(istype(UT, /turf/simulated) && UT.zone == T.zone && UT.CanPass(null, NT, 0, 0)) //If we find a neighboring tile that is in the same zone, check if we need to rebuild - consider_rebuild = 1 - break - if(consider_rebuild) - air_master.AddToConsiderRebuild(T,NT) //Gotta check if we need to rebuild, dammit - else - T.zone.RemoveTurf(NT) //Not adjacent to anything, and unsimulated. Goodbye~ + if(!CanPass(null, T, 0, 0)) //If either block air from a door + if(!CanPass(null, src, 0, 0)) //I block air, so I have a door. Forge a closed connection through me. + ZConnect(src, T) else ZConnect(src,T) diff --git a/code/ZAS/ZAS_Zones.dm b/code/ZAS/ZAS_Zones.dm index ab4908f9c8f..66fd67d9605 100644 --- a/code/ZAS/ZAS_Zones.dm +++ b/code/ZAS/ZAS_Zones.dm @@ -12,6 +12,7 @@ zone list/connections // /connection objects which refer to connections with other zones, e.g. through a door. list/connected_zones //Parallels connections, but lists zones to which this one is connected and the number //of points they're connected at. + list/closed_connection_zones //Same as connected_zones, but for zones where the door or whatever is closed. list/unsimulated_tiles // Any space tiles in this list will cause air to flow out. last_update = 0 progress = "nothing" @@ -244,9 +245,11 @@ zone/proc/process() //Do merging if conditions are met. Specifically, if there's a non-door connection //to somewhere with space, the zones are merged regardless of equilibrium, to speed //up spacing in areas with double-plated windows. - if(C && C.indirect == 2 && C.A.zone && C.B.zone) //indirect = 2 is a direct connection. - if(C.A.zone.air.compare(C.B.zone.air) || unsimulated_tiles) - ZMerge(C.A.zone,C.B.zone) + if(C && C.A.zone && C.B.zone) + //indirect = 2 is a direct connection. + if(C.indirect == 2 ) + if(C.A.zone.air.compare(C.B.zone.air) || unsimulated_tiles) + ZMerge(C.A.zone,C.B.zone) progress = "problem with: ShareRatio(), Airflow(), a couple of misc procs" @@ -269,6 +272,11 @@ zone/proc/process() Airflow(src,Z) ShareRatio( air , Z.air , connected_zones[Z] ) + for(var/zone/Z in closed_connection_zones) + if(air && Z.air) + if( abs(air.temperature - Z.air.temperature) > 50 ) + ShareHeat(air, Z.air, closed_connection_zones[Z]) + progress = "all components completed successfully, the problem is not here" //////////////// @@ -407,6 +415,29 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles) return abs(old_pressure - A.return_pressure()) + +proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) + //Shares a specific ratio of gas between mixtures using simple weighted averages. + var + //WOOT WOOT TOUCH THIS AND YOU ARE A RETARD + ratio = 0.33 + //WOOT WOOT TOUCH THIS AND YOU ARE A RETARD + + full_heat_capacity = A.heat_capacity() + + s_full_heat_capacity = B.heat_capacity() + + temp_avg = (A.temperature * full_heat_capacity + B.temperature * s_full_heat_capacity) / (full_heat_capacity + s_full_heat_capacity) + + //WOOT WOOT TOUCH THIS AND YOU ARE A RETARD + if(sharing_lookup_table.len >= connecting_tiles) //6 or more interconnecting tiles will max at 42% of air moved per tick. + ratio = sharing_lookup_table[connecting_tiles] + //WOOT WOOT TOUCH THIS AND YOU ARE A RETARD + + A.temperature = max(0, (A.temperature - temp_avg) * (1- (ratio / max(1,A.group_multiplier)) ) + temp_avg ) + B.temperature = max(0, (B.temperature - temp_avg) * (1- (ratio / max(1,B.group_multiplier)) ) + temp_avg ) + + /////////////////// //Zone Rebuilding// /////////////////// @@ -487,6 +518,7 @@ zone/proc/Rebuild() if(istype(T) && T.zone && S.CanPass(null, T, 0, 0)) T.zone.AddTurf(S) + proc/play_wind_sound(var/turf/random_border, var/n) if(random_border) var/windsound = 'sound/effects/wind/wind_2_1.ogg'