mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 19:47:22 +01:00
Merge pull request #1527 from SkyMarshal/master
Connections no longer are deleted when a door closes, instead persisting until merged or a wall is built there or something. Better runtime detection, and no more searching through world for fires to process.
This commit is contained in:
+216
-152
@@ -2,6 +2,10 @@
|
||||
This object is contained within zone/var/connections. It's generated whenever two turfs from different zones are linked.
|
||||
Indirect connections will not merge the two zones after they reach equilibrium.
|
||||
*/
|
||||
#define CONNECTION_DIRECT 2
|
||||
#define CONNECTION_INDIRECT 1
|
||||
#define CONNECTION_CLOSED 0
|
||||
|
||||
|
||||
connection
|
||||
var
|
||||
@@ -16,6 +20,7 @@ connection
|
||||
indirect = 0 //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
|
||||
|
||||
New(turf/T,turf/O)
|
||||
A = T
|
||||
B = O
|
||||
@@ -30,52 +35,59 @@ connection
|
||||
zone_B = B.zone
|
||||
ref_B = "\ref[B]"
|
||||
|
||||
if(!A.connections)
|
||||
A.connections = list(src)
|
||||
if(ref_A in air_master.turfs_with_connections)
|
||||
var/list/connections = air_master.turfs_with_connections[ref_A]
|
||||
connections.Add(src)
|
||||
else
|
||||
A.connections += src
|
||||
air_master.turfs_with_connections[ref_A] = list(src)
|
||||
|
||||
if(!B.connections)
|
||||
B.connections = list(src)
|
||||
if(ref_B in air_master.turfs_with_connections)
|
||||
var/list/connections = air_master.turfs_with_connections[ref_B]
|
||||
connections.Add(src)
|
||||
else
|
||||
B.connections += src
|
||||
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(!(B.zone in A.zone.connected_zones))
|
||||
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
|
||||
else
|
||||
A.zone.connected_zones[B.zone]++
|
||||
|
||||
if(!(A.zone in B.zone.connected_zones))
|
||||
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
|
||||
else
|
||||
B.zone.connected_zones[A.zone]++
|
||||
if(A.HasDoor(B) || B.HasDoor(A))
|
||||
indirect = 1
|
||||
else
|
||||
world.log << "Attempted to create connection object for non-zone tiles: [T] -> [O]"
|
||||
del(src)
|
||||
|
||||
Del()
|
||||
if(ref_B in air_master.turfs_with_connections)
|
||||
var/list/connections = air_master.turfs_with_connections[ref_B]
|
||||
connections.Remove(src)
|
||||
|
||||
if(ref_A in air_master.turfs_with_connections)
|
||||
var/list/connections = air_master.turfs_with_connections[ref_A]
|
||||
connections.Remove(src)
|
||||
|
||||
if(A)
|
||||
if(A.zone && A.zone.connections)
|
||||
A.zone.connections.Remove(src)
|
||||
if(!A.zone.connections.len)
|
||||
del A.zone.connections
|
||||
if(istype(A))
|
||||
A.connections -= src
|
||||
if(B)
|
||||
if(B.zone && B.zone.connections)
|
||||
B.zone.connections.Remove(src)
|
||||
if(!B.zone.connections.len)
|
||||
del B.zone.connections
|
||||
if(istype(B))
|
||||
B.connections -= src
|
||||
if(zone_A)
|
||||
if(zone_A && zone_A.connections)
|
||||
zone_A.connections.Remove(src)
|
||||
@@ -87,74 +99,75 @@ connection
|
||||
if(!zone_B.connections.len)
|
||||
del zone_B.connections
|
||||
|
||||
if(A && A.zone)
|
||||
if(B && B.zone)
|
||||
if(B.zone in A.zone.connected_zones)
|
||||
if(A.zone.connected_zones[B.zone] > 1)
|
||||
A.zone.connected_zones[B.zone]--
|
||||
else
|
||||
A.zone.connected_zones -= B.zone
|
||||
if(A.zone.connected_zones && !A.zone.connected_zones.len)
|
||||
A.zone.connected_zones = null
|
||||
if( zone_B && (!B.zone || zone_B != B.zone) )
|
||||
if(zone_B in A.zone.connected_zones)
|
||||
if(A.zone.connected_zones[zone_B] > 1)
|
||||
A.zone.connected_zones[zone_B]--
|
||||
else
|
||||
A.zone.connected_zones -= zone_B
|
||||
if(A.zone.connected_zones && !A.zone.connected_zones.len)
|
||||
A.zone.connected_zones = null
|
||||
if(zone_A && (!A.zone || zone_A != A.zone))
|
||||
if(B && B.zone)
|
||||
if(B.zone in zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[B.zone] > 1)
|
||||
zone_A.connected_zones[B.zone]--
|
||||
else
|
||||
zone_A.connected_zones -= B.zone
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if( zone_B && (!B.zone || zone_B != B.zone) )
|
||||
if(zone_B in zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones -= zone_B
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if(B && B.zone)
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(A && A.zone)
|
||||
if(A.zone in B.zone.connected_zones)
|
||||
if(B.zone.connected_zones[A.zone] > 1)
|
||||
B.zone.connected_zones[A.zone]--
|
||||
else
|
||||
B.zone.connected_zones -= A.zone
|
||||
if(B.zone.connected_zones && !B.zone.connected_zones.len)
|
||||
B.zone.connected_zones = null
|
||||
if( zone_A && (!A.zone || zone_A != A.zone) )
|
||||
if(zone_A in B.zone.connected_zones)
|
||||
if(B.zone.connected_zones[zone_A] > 1)
|
||||
B.zone.connected_zones[zone_A]--
|
||||
else
|
||||
B.zone.connected_zones -= zone_A
|
||||
if(B.zone.connected_zones && !B.zone.connected_zones.len)
|
||||
B.zone.connected_zones = null
|
||||
if(zone_B && (!B.zone || zone_B != B.zone))
|
||||
if(A && A.zone)
|
||||
if(A.zone in zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[A.zone] > 1)
|
||||
zone_B.connected_zones[A.zone]--
|
||||
else
|
||||
zone_B.connected_zones -= A.zone
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if( zone_A && (!A.zone || zone_A != A.zone) )
|
||||
if(zone_A in zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones -= zone_A
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if(B && B.zone)
|
||||
if(B.zone in A.zone.connected_zones)
|
||||
if(A.zone.connected_zones[B.zone] > 1)
|
||||
A.zone.connected_zones[B.zone]--
|
||||
else
|
||||
A.zone.connected_zones -= B.zone
|
||||
if(A.zone.connected_zones && !A.zone.connected_zones.len)
|
||||
A.zone.connected_zones = null
|
||||
if( zone_B && (!B.zone || zone_B != B.zone) )
|
||||
if(zone_B in A.zone.connected_zones)
|
||||
if(A.zone.connected_zones[zone_B] > 1)
|
||||
A.zone.connected_zones[zone_B]--
|
||||
else
|
||||
A.zone.connected_zones -= zone_B
|
||||
if(A.zone.connected_zones && !A.zone.connected_zones.len)
|
||||
A.zone.connected_zones = null
|
||||
if(zone_A && (!A.zone || zone_A != A.zone))
|
||||
if(B && B.zone)
|
||||
if(B.zone in zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[B.zone] > 1)
|
||||
zone_A.connected_zones[B.zone]--
|
||||
else
|
||||
zone_A.connected_zones -= B.zone
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if( zone_B && (!B.zone || zone_B != B.zone) )
|
||||
if(zone_B in zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones -= zone_B
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if(B && B.zone)
|
||||
if(A && A.zone)
|
||||
if(A.zone in B.zone.connected_zones)
|
||||
if(B.zone.connected_zones[A.zone] > 1)
|
||||
B.zone.connected_zones[A.zone]--
|
||||
else
|
||||
B.zone.connected_zones -= A.zone
|
||||
if(B.zone.connected_zones && !B.zone.connected_zones.len)
|
||||
B.zone.connected_zones = null
|
||||
if( zone_A && (!A.zone || zone_A != A.zone) )
|
||||
if(zone_A in B.zone.connected_zones)
|
||||
if(B.zone.connected_zones[zone_A] > 1)
|
||||
B.zone.connected_zones[zone_A]--
|
||||
else
|
||||
B.zone.connected_zones -= zone_A
|
||||
if(B.zone.connected_zones && !B.zone.connected_zones.len)
|
||||
B.zone.connected_zones = null
|
||||
if(zone_B && (!B.zone || zone_B != B.zone))
|
||||
if(A && A.zone)
|
||||
if(A.zone in zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[A.zone] > 1)
|
||||
zone_B.connected_zones[A.zone]--
|
||||
else
|
||||
zone_B.connected_zones -= A.zone
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if( zone_A && (!A.zone || zone_A != A.zone) )
|
||||
if(zone_A in zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones -= zone_A
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
. = ..()
|
||||
|
||||
proc/Cleanup()
|
||||
@@ -176,14 +189,55 @@ connection
|
||||
return 0
|
||||
return 1
|
||||
|
||||
proc/UpdateZones() //Changes connection data in the zones if it is required.
|
||||
if(A.ZAirPass(B))
|
||||
var/door_pass = A.CanPass(null,B,1.5,1)
|
||||
if(door_pass || A.CanPass(null,B,0,0))
|
||||
if(indirect == CONNECTION_CLOSED)
|
||||
//ADJUST FOR CAN CONNECT
|
||||
if(!A.zone.connected_zones)
|
||||
A.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(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
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(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)
|
||||
A.zone.connected_zones[B.zone]--
|
||||
else
|
||||
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
|
||||
else //If I can no longer pass air, better delete
|
||||
del src
|
||||
|
||||
proc/CheckPassSanity()
|
||||
Cleanup()
|
||||
if(!A.CanPass(null, B, 0, 0))
|
||||
del src
|
||||
if(A.HasDoor(B) || B.HasDoor(A))
|
||||
indirect = 1
|
||||
else
|
||||
indirect = 0
|
||||
UpdateZones()
|
||||
return 1
|
||||
|
||||
proc/Sanitize()
|
||||
//If the zones change on connected turfs, update it.
|
||||
@@ -208,13 +262,14 @@ connection
|
||||
if(!zone_A.connections.len)
|
||||
del zone_A.connections
|
||||
|
||||
if(zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones.Remove(zone_B)
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones.Remove(zone_B)
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
|
||||
if(zone_B)
|
||||
if(zone_B.connections)
|
||||
@@ -222,36 +277,38 @@ connection
|
||||
if(!zone_B.connections.len)
|
||||
del zone_B.connections
|
||||
|
||||
if(zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones.Remove(zone_A)
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones.Remove(zone_A)
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
|
||||
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(indirect != CONNECTION_CLOSED)
|
||||
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.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
if(!(B.zone in A.zone.connected_zones))
|
||||
A.zone.connected_zones += B.zone
|
||||
A.zone.connected_zones[B.zone] = 1
|
||||
else
|
||||
A.zone.connected_zones[B.zone]++
|
||||
if(!A.zone.connected_zones)
|
||||
A.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(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
if(!(A.zone in B.zone.connected_zones))
|
||||
B.zone.connected_zones += A.zone
|
||||
B.zone.connected_zones[A.zone] = 1
|
||||
else
|
||||
B.zone.connected_zones[A.zone]++
|
||||
if(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
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
|
||||
|
||||
zone_B = B.zone
|
||||
|
||||
@@ -269,21 +326,22 @@ connection
|
||||
A.zone.connections = list()
|
||||
A.zone.connections |= src
|
||||
|
||||
if(zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones.Remove(zone_B)
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones.Remove(zone_B)
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
|
||||
if(!A.zone.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
if(!(zone_B in A.zone.connected_zones))
|
||||
A.zone.connected_zones += zone_B
|
||||
A.zone.connected_zones[zone_B] = 1
|
||||
else
|
||||
A.zone.connected_zones[zone_B]++
|
||||
if(!A.zone.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
if(!(zone_B in A.zone.connected_zones))
|
||||
A.zone.connected_zones += zone_B
|
||||
A.zone.connected_zones[zone_B] = 1
|
||||
else
|
||||
A.zone.connected_zones[zone_B]++
|
||||
|
||||
zone_A = A.zone
|
||||
|
||||
@@ -301,23 +359,29 @@ connection
|
||||
B.zone.connections = list()
|
||||
B.zone.connections |= src
|
||||
|
||||
if(zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones.Remove(zone_A)
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones.Remove(zone_A)
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
|
||||
if(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
if(!(zone_A in B.zone.connected_zones))
|
||||
B.zone.connected_zones += zone_A
|
||||
B.zone.connected_zones[zone_A] = 1
|
||||
else
|
||||
B.zone.connected_zones[zone_A]++
|
||||
if(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
if(!(zone_A in B.zone.connected_zones))
|
||||
B.zone.connected_zones += zone_A
|
||||
B.zone.connected_zones[zone_A] = 1
|
||||
else
|
||||
B.zone.connected_zones[zone_A]++
|
||||
|
||||
zone_B = B.zone
|
||||
|
||||
else
|
||||
del src
|
||||
del src
|
||||
|
||||
|
||||
#undef CONNECTION_DIRECT
|
||||
#undef CONNECTION_INDIRECT
|
||||
#undef CONNECTION_CLOSED
|
||||
+18
-14
@@ -92,16 +92,14 @@ datum
|
||||
controller
|
||||
air_system
|
||||
//Geoemetry lists
|
||||
// var/list/turf/simulated/active_singletons = list()
|
||||
var/list/turf/simulated/turfs_with_connections = list()
|
||||
var/list/obj/fire/active_hotspots = list()
|
||||
|
||||
//Special functions lists
|
||||
// var/list/turf/simulated/active_super_conductivity = list()
|
||||
// var/list/turf/simulated/high_pressure_delta = list()
|
||||
|
||||
//Geometry updates lists
|
||||
var/list/turf/simulated/tiles_to_update = list()
|
||||
var/list/connection/connections_checked = list()
|
||||
// var/list/turf/simulated/groups_to_rebuild = list()
|
||||
|
||||
var/current_cycle = 0
|
||||
var/update_delay = 5 //How long between check should it try to process atmos again.
|
||||
@@ -144,7 +142,7 @@ datum
|
||||
S.update_air_properties()
|
||||
|
||||
world << "\red \b Geometry processed in [time2text(world.timeofday-start_time, "mm:ss")] minutes!"
|
||||
spawn start()
|
||||
// spawn start()
|
||||
|
||||
proc/start()
|
||||
//Purpose: This is kicked off by the master controller, and controls the processing of all atmosphere.
|
||||
@@ -168,16 +166,19 @@ datum
|
||||
*/
|
||||
|
||||
proc/tick()
|
||||
. = 1 //Set the default return value, for runtime detection.
|
||||
|
||||
if(current_cycle >= next_stat_check)
|
||||
var/zone/z = pick(zones)
|
||||
var/log_file = file("[time2text(world.timeofday, "statistics/DD-MM-YYYY.txt")]")
|
||||
log_file << "Zone | \The [get_area(pick(z.contents))] | [z.air.oxygen], [z.air.nitrogen], [z.air.carbon_dioxide], [z.air.toxins] | [z.air.temperature] | [z.air.group_multiplier * z.air.volume]"
|
||||
var/log_file = file("[time2text(world.timeofday, "statistics/DD-MM-YYYY-air.txt")]")
|
||||
log_file << "\"\The [get_area(pick(z.contents))]\",[z.air.oxygen],[z.air.nitrogen],[z.air.carbon_dioxide],[z.air.toxins],[z.air.temperature],[z.air.group_multiplier * z.air.volume]"
|
||||
next_stat_check = current_cycle + (rand(5,7)*60)
|
||||
|
||||
if(tiles_to_update.len > 0) //If there are tiles to update, do so.
|
||||
for(var/turf/simulated/T in tiles_to_update)
|
||||
T.update_air_properties()
|
||||
var/output = T.update_air_properties()
|
||||
if(. && T && !output)
|
||||
. = 0 //If a runtime occured, make sure we can sense it.
|
||||
tiles_to_update = list()
|
||||
for(var/connection/C in connections_checked)
|
||||
C.CheckPassSanity()
|
||||
@@ -185,10 +186,13 @@ datum
|
||||
|
||||
for(var/zone/Z in zones)
|
||||
if(Z.last_update < current_cycle)
|
||||
Z.process()
|
||||
if(Z) Z.last_update = current_cycle
|
||||
var/output = Z.process()
|
||||
if(Z)
|
||||
Z.last_update = current_cycle
|
||||
if(. && Z && !output)
|
||||
. = 0
|
||||
|
||||
for(var/obj/fire/F)
|
||||
F.process()
|
||||
|
||||
return 1
|
||||
for(var/obj/fire/F in active_hotspots)
|
||||
var/output = F.process()
|
||||
if(. && F && !output)
|
||||
. = 0
|
||||
@@ -51,7 +51,6 @@ turf
|
||||
// current_cycle = 0
|
||||
|
||||
obj/fire/active_hotspot
|
||||
tmp/list/connections
|
||||
|
||||
// temperature_archived //USED ONLY FOR SOLIDS
|
||||
// being_superconductive = 0
|
||||
@@ -194,12 +193,12 @@ turf
|
||||
if(!zone) //Still no zone, the floodfill determined it is not part of a larger zone. Force a zone on it.
|
||||
new/zone(list(src))
|
||||
|
||||
if(connections) //Check pass sanity of the connections.
|
||||
for(var/connection/C in connections)
|
||||
if("\ref[src]" in air_master.turfs_with_connections) //Check pass sanity of the connections.
|
||||
for(var/connection/C in air_master.turfs_with_connections["\ref[src]"])
|
||||
if(!(C in air_master.connections_checked))
|
||||
air_master.connections_checked += C
|
||||
|
||||
update_zone_properties() //Update self zone and adjacent zones.
|
||||
. = update_zone_properties() //Update self zone and adjacent zones.
|
||||
|
||||
if(air_check_directions)
|
||||
processing = 1
|
||||
@@ -220,6 +219,7 @@ turf
|
||||
|
||||
else
|
||||
ZConnect(src,T)
|
||||
return 1
|
||||
|
||||
// else if(zone && !zone.rebuild)
|
||||
// for(var/direction2 in cardinal - reverse_direction(direction)) //Check all other directions for air that might be connected.
|
||||
|
||||
@@ -77,6 +77,7 @@ obj
|
||||
archived_firelevel = 0
|
||||
|
||||
process()
|
||||
. = 1
|
||||
|
||||
if(firelevel > vsc.IgnitionLevel)
|
||||
|
||||
@@ -167,12 +168,14 @@ obj
|
||||
firelevel = fl
|
||||
for(var/mob/living/carbon/human/M in loc)
|
||||
M.FireBurn(min(max(0.1,firelevel / 20),10)) //Burn the humans!
|
||||
air_master.active_hotspots.Add(src)
|
||||
|
||||
Del()
|
||||
if (istype(loc, /turf/simulated))
|
||||
ul_SetLuminosity(0)
|
||||
|
||||
loc = null
|
||||
air_master.active_hotspots.Remove(src)
|
||||
|
||||
..()
|
||||
|
||||
|
||||
@@ -130,8 +130,8 @@ proc/ZConnect(turf/simulated/A,turf/simulated/B)
|
||||
return ZMerge(A.zone,B.zone)
|
||||
|
||||
//Ensure the connection isn't already made.
|
||||
if(A.connections)
|
||||
for(var/connection/C in A.connections)
|
||||
if("\ref[A]" in air_master.turfs_with_connections)
|
||||
for(var/connection/C in air_master.turfs_with_connections["\ref[A]"])
|
||||
C.Cleanup()
|
||||
if(C && (C.B == B || C.A == B))
|
||||
return
|
||||
|
||||
+30
-36
@@ -1,10 +1,11 @@
|
||||
#define QUANTIZE(variable) (round(variable,0.0001))
|
||||
zone/proc/process()
|
||||
. = 1
|
||||
|
||||
//Deletes zone if empty.
|
||||
if(!contents.len)
|
||||
del src
|
||||
return 0
|
||||
//Does rebuilding stuff. Not sure if used.
|
||||
//Does rebuilding stuff.
|
||||
if(rebuild)
|
||||
rebuild = 0
|
||||
Rebuild() //Shoving this into a proc.
|
||||
@@ -76,7 +77,7 @@ 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 && C.A.zone && C.B.zone)
|
||||
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) || total_space)
|
||||
ZMerge(C.A.zone,C.B.zone)
|
||||
|
||||
@@ -191,23 +192,6 @@ proc/ShareSpace(datum/gas_mixture/A, ratio)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
zone/proc/connected_zones()
|
||||
//A legacy proc for getting connected zones.
|
||||
. = list()
|
||||
for(var/connection/C in connections)
|
||||
var/zone/Z
|
||||
if(C.A.zone == src)
|
||||
Z = C.B.zone
|
||||
else
|
||||
Z = C.A.zone
|
||||
|
||||
if(Z in .)
|
||||
.[Z]++
|
||||
else
|
||||
. += Z
|
||||
.[Z] = 1
|
||||
|
||||
zone/proc/Rebuild()
|
||||
//Choose a random turf and regenerate the zone from it.
|
||||
var
|
||||
@@ -215,11 +199,6 @@ zone/proc/Rebuild()
|
||||
list/new_contents
|
||||
problem = 0
|
||||
|
||||
contents.Remove(null) //I can't believe this is needed.
|
||||
|
||||
if(!contents.len)
|
||||
del src
|
||||
|
||||
var/list/turfs_to_consider = contents.Copy()
|
||||
do
|
||||
if(sample)
|
||||
@@ -237,9 +216,8 @@ zone/proc/Rebuild()
|
||||
new_contents = FloodFill(sample)
|
||||
|
||||
for(var/turf/space/S in new_contents)
|
||||
if(!space_tiles)
|
||||
space_tiles = list()
|
||||
space_tiles |= S
|
||||
AddSpace(S)
|
||||
new_contents.Remove(S)
|
||||
|
||||
if(contents.len != new_contents.len)
|
||||
problem = 1
|
||||
@@ -255,20 +233,20 @@ zone/proc/Rebuild()
|
||||
var/list/turf/simulated/rebuild_turfs = contents - new_contents
|
||||
var/list/turf/simulated/reconsider_turfs = list()
|
||||
contents = new_contents
|
||||
for(var/turf/T in rebuild_turfs)
|
||||
if(istype(T,/turf/space))
|
||||
air_master.tiles_to_update |= T
|
||||
else if(!T.zone && T.CanPass(null, T, 1.5, 1))
|
||||
for(var/turf/simulated/T in rebuild_turfs)
|
||||
if(!T.zone && T.CanPass(null, T, 1.5, 1))
|
||||
var/zone/Z = new /zone(T)
|
||||
Z.air.copy_from(air)
|
||||
else
|
||||
reconsider_turfs |= T
|
||||
for(var/turf/T in reconsider_turfs)
|
||||
if(!T.zone)
|
||||
for(var/turf/simulated/T in reconsider_turfs)
|
||||
if(!T.zone && T.CanPass(null, T, 1.5, 1))
|
||||
var/zone/Z = new /zone(T)
|
||||
Z.air.copy_from(air)
|
||||
else if(!T in air_master.tiles_to_update)
|
||||
air_master.tiles_to_update.Add(T)
|
||||
|
||||
for(var/turf/T in contents)
|
||||
for(var/turf/simulated/T in contents)
|
||||
if(T.zone && T.zone != src)
|
||||
T.zone.RemoveTurf(T)
|
||||
T.zone = src
|
||||
@@ -283,4 +261,20 @@ zone/proc/Rebuild()
|
||||
for(var/direction in cardinal)
|
||||
var/turf/simulated/T = get_step(S,direction)
|
||||
if(istype(T) && T.zone)
|
||||
T.zone.AddSpace(S)
|
||||
T.zone.AddSpace(S)
|
||||
/*
|
||||
zone/proc/connected_zones()
|
||||
//A legacy proc for getting connected zones.
|
||||
. = list()
|
||||
for(var/connection/C in connections)
|
||||
var/zone/Z
|
||||
if(C.A.zone == src)
|
||||
Z = C.B.zone
|
||||
else
|
||||
Z = C.A.zone
|
||||
|
||||
if(Z in .)
|
||||
.[Z]++
|
||||
else
|
||||
. += Z
|
||||
.[Z] = 1*/
|
||||
@@ -176,8 +176,11 @@ datum/controller/game_controller
|
||||
air_master.current_cycle++
|
||||
var/success = air_master.tick() //Changed so that a runtime does not crash the ticker.
|
||||
if(!success) //Runtimed.
|
||||
world << "<font color='red'><b>ERROR IN ATMOS TICKER. Killing air simulation!</font></b>"
|
||||
kill_air = 1
|
||||
air_master.failed_ticks++
|
||||
if(air_master.failed_ticks > 5)
|
||||
world << "<font color='red'><b>RUNTIMES IN ATMOS TICKER. Killing air simulation!</font></b>"
|
||||
kill_air = 1
|
||||
air_master.failed_ticks = 0
|
||||
air_master_ready = 1
|
||||
|
||||
src.set_debug_state("Tension Master")
|
||||
|
||||
Reference in New Issue
Block a user