mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
Replaced it with use of the atom-level var pressure_resistance. Engineering, deathsquid, and ERT hardsuits now resist up to 20MPa of pressure, security and medical 4MPa, and soft suits 0.5MPa. Pressure protection can now also come from items equipped in slots other than the head or suit.
62 lines
1.8 KiB
Plaintext
62 lines
1.8 KiB
Plaintext
/atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
|
|
//Purpose: Determines if the object (or airflow) can pass this atom.
|
|
//Called by: Movement, airflow.
|
|
//Inputs: The moving atom (optional), target turf, "height" and air group
|
|
//Outputs: Boolean if can pass.
|
|
|
|
return (!density || !height || air_group)
|
|
|
|
/turf/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
|
|
if(!target) return 0
|
|
|
|
if(istype(mover)) // turf/Enter(...) will perform more advanced checks
|
|
return !density
|
|
|
|
else // Now, doing more detailed checks for air movement and air group formation
|
|
if(target.blocks_air||blocks_air)
|
|
return 0
|
|
|
|
for(var/obj/obstacle in src)
|
|
if(!obstacle.CanPass(mover, target, height, air_group))
|
|
return 0
|
|
if(target != src)
|
|
for(var/obj/obstacle in target)
|
|
if(!obstacle.CanPass(mover, src, height, air_group))
|
|
return 0
|
|
|
|
return 1
|
|
|
|
//Basically another way of calling CanPass(null, other, 0, 0) and CanPass(null, other, 1.5, 1).
|
|
//Returns:
|
|
// 0 - Not blocked
|
|
// AIR_BLOCKED - Blocked
|
|
// ZONE_BLOCKED - Not blocked, but zone boundaries will not cross.
|
|
// BLOCKED - Blocked, zone boundaries will not cross even if opened.
|
|
atom/proc/c_airblock(turf/other)
|
|
#ifdef ZASDBG
|
|
ASSERT(isturf(other))
|
|
#endif
|
|
return !CanPass(null, other, 0, 0) + 2*!CanPass(null, other, 1.5, 1)
|
|
|
|
|
|
turf/c_airblock(turf/other)
|
|
#ifdef ZASDBG
|
|
ASSERT(isturf(other))
|
|
#endif
|
|
if(blocks_air)
|
|
return BLOCKED
|
|
|
|
//Z-level handling code. Always block if there isn't an open space.
|
|
#ifdef ZLEVELS
|
|
if(other.z != src.z)
|
|
if(other.z < src.z)
|
|
if(!istype(src, /turf/simulated/floor/open)) return BLOCKED
|
|
else
|
|
if(!istype(other, /turf/simulated/floor/open)) return BLOCKED
|
|
#endif
|
|
|
|
var/result = 0
|
|
for(var/atom/movable/M in contents)
|
|
result |= M.c_airblock(other)
|
|
if(result == BLOCKED) return BLOCKED
|
|
return result |