mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 18:32:03 +00:00
173 lines
4.7 KiB
Plaintext
173 lines
4.7 KiB
Plaintext
zone
|
|
proc
|
|
AddTurf(turf/T)
|
|
if(T in contents) return
|
|
contents += T
|
|
air.group_multiplier++
|
|
T.zone = src
|
|
RemoveTurf(turf/T)
|
|
if(!(T in contents)) return
|
|
contents -= T
|
|
air.group_multiplier--
|
|
T.zone = null
|
|
|
|
DivideAir(ratio)
|
|
ratio = min(1,max(0,ratio))
|
|
air.oxygen *= ratio
|
|
air.oxygen = QUANTIZE(air.oxygen)
|
|
air.nitrogen *= ratio
|
|
air.nitrogen = QUANTIZE(air.nitrogen)
|
|
air.toxins *= ratio
|
|
air.toxins = QUANTIZE(air.toxins)
|
|
air.carbon_dioxide *= ratio
|
|
air.carbon_dioxide = QUANTIZE(air.carbon_dioxide)
|
|
if(air.trace_gases.len)
|
|
for(var/datum/gas/trace_gas in air.trace_gases)
|
|
trace_gas.moles *= ratio
|
|
trace_gas.moles = QUANTIZE(trace_gas.moles)
|
|
air.temperature = air.temperature*ratio + TCMB*(1-ratio)
|
|
air.temperature = QUANTIZE(air.temperature)
|
|
|
|
AddSpace(turf/space/S)
|
|
if(istype(S,/turf/space))
|
|
if(!space_tiles) space_tiles = list()
|
|
space_tiles += S
|
|
RemoveSpace(turf/space/S)
|
|
if(space_tiles)
|
|
space_tiles -= S
|
|
if(!space_tiles.len) space_tiles = null
|
|
|
|
turf/proc/HasDoor(turf/O)
|
|
for(var/obj/machinery/door/D in src)
|
|
if(isnum(O) && O)
|
|
if(!D.density) continue
|
|
if(istype(D,/obj/machinery/door/window))
|
|
if(!O) continue
|
|
if(D.dir == get_dir(D,O)) return 1
|
|
else
|
|
return 1
|
|
|
|
turf/proc/find_zone()
|
|
if(world.time < 10) return
|
|
for(var/d in cardinal)
|
|
var/turf/T = get_step(src,d)
|
|
if(!T || !T.zone || !T.ZCanPass(src)) continue
|
|
if(!zone)
|
|
zone = T.zone
|
|
zone.AddTurf(src)
|
|
else if(T.zone != zone)
|
|
ZConnect(src,T)
|
|
|
|
turf/proc/check_connections()
|
|
for(var/d in cardinal)
|
|
var/turf/T = get_step(src,d)
|
|
if(!T || !T.zone || !T.CanPass(0,src,0,0)) continue
|
|
if(T.zone != zone)
|
|
ZConnect(src,T)
|
|
|
|
turf/proc/check_for_space()
|
|
for(var/d in cardinal)
|
|
var/turf/T = get_step(src,d)
|
|
if(istype(T,/turf/space) && T.CanPass(0,src,0,0))
|
|
zone.AddSpace(T)
|
|
|
|
proc
|
|
ZMerge(zone/A,zone/B)
|
|
//world << "Merge occured."
|
|
var
|
|
a_size = A.air.group_multiplier
|
|
b_size = B.air.group_multiplier
|
|
c_size = a_size + b_size
|
|
new_contents = A.contents + B.contents
|
|
|
|
A.air.group_multiplier = 1
|
|
B.air.group_multiplier = 1
|
|
|
|
A.air.remove_ratio(a_size/c_size)
|
|
B.air.remove_ratio(b_size/c_size)
|
|
A.air.merge(B.air)
|
|
A.air.group_multiplier = c_size
|
|
|
|
for(var/connection/C in B.connections)
|
|
if((C.A in new_contents) && (C.B in new_contents))
|
|
del C
|
|
continue
|
|
if(!A.connections) A.connections = list()
|
|
A.connections += C
|
|
A.space_tiles += B.space_tiles
|
|
A.contents = new_contents
|
|
for(var/turf/T in B.contents)
|
|
T.zone = A
|
|
del B
|
|
|
|
ZConnect(turf/A,turf/B)
|
|
if(istype(B,/turf/space))
|
|
if(A.zone)
|
|
A.zone.AddSpace(B)
|
|
//world << "Space added."
|
|
return
|
|
if(istype(A,/turf/space))
|
|
if(B.zone)
|
|
B.zone.AddSpace(A)
|
|
//world << "Space added."
|
|
return
|
|
if(!A.zone || !B.zone) return
|
|
if(A.zone == B.zone) return
|
|
if(!A.CanPass(0,B,0,0)) return
|
|
for(var/connection/C in A.zone.connections)
|
|
if((C.A == A && C.B == B) || (C.A == B && C.B == A))
|
|
return
|
|
var/connection/C = new(A,B)
|
|
if(A.HasDoor(B) || B.HasDoor(A)) C.indirect = 1
|
|
//world << "Connection Formed: [A] --> [B] [(C.indirect?"Indirect":"Direct")]"
|
|
//A.overlays += 'zone_connection_A.dmi'
|
|
//B.overlays += 'zone_connection_B.dmi'
|
|
//spawn(10)
|
|
// A.overlays -= 'zone_connection_A.dmi'
|
|
// B.overlays -= 'zone_connection_B.dmi'
|
|
|
|
|
|
ZDisconnect(turf/A,turf/B)
|
|
if(A.zone && B.zone)
|
|
if(A.zone != B.zone)
|
|
for(var/connection/C in A.zone.connections)
|
|
if((C.A == A && C.B == B) || (C.A == B && C.B == A))
|
|
//world << "Connection Dissolved: [A] -/-> [B] [(C.indirect?"Indirect":"Direct")]"
|
|
/*A.overlays += 'zone_connection_A.dmi'
|
|
B.overlays += 'zone_connection_B.dmi'
|
|
spawn(10)
|
|
A.overlays -= 'zone_connection_A.dmi'
|
|
B.overlays -= 'zone_connection_B.dmi'*/
|
|
del C
|
|
else
|
|
if(A == B) return
|
|
if(A.CanPass(0,B,0,0)) return
|
|
if(A.HasDoor(B) || B.HasDoor(A)) return
|
|
var/zone/oldzone = A.zone
|
|
var/list/test = FloodFill(A)
|
|
if(B in test) return
|
|
else
|
|
var/zone/Z = new(test,oldzone.air)
|
|
for(var/connection/C in oldzone.connections)
|
|
if((A in Z.contents) || (B in Z.contents))
|
|
if(!Z.connections) Z.connections = list()
|
|
Z.connections += C
|
|
for(var/turf/T in test)
|
|
T.check_for_space()
|
|
var/datum/gas_mixture/Y_Air = new
|
|
Y_Air.copy_from(oldzone.air)
|
|
var/zone/Y = new(B,Y_Air)
|
|
for(var/connection/C in oldzone.connections)
|
|
if((A in Y.contents) || (B in Y.contents))
|
|
if(!Y.connections) Y.connections = list()
|
|
Y.connections += C
|
|
for(var/turf/space/T in oldzone.space_tiles)
|
|
if(!(T in Z.space_tiles))
|
|
Y.AddSpace(T)
|
|
oldzone.air = null
|
|
del oldzone
|
|
else
|
|
if(istype(A,/turf/space) && B.zone)
|
|
B.zone.RemoveSpace(A)
|
|
else if(istype(B,/turf/space) && A.zone)
|
|
A.zone.RemoveSpace(B) |