mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-01-16 12:22:42 +00:00
Refactored the projectile code, mostly in line with TG's now. Refactored various procs that are used or depends on it. Projectiles can now ricochet if enabled to. Damage falloffs with distance. Homing projectiles can now have accuracy falloff with distance. Projectiles have a maximum range. Muzzle flash is configurable per projectile. Impact effect of the projectile is configurable per projectile. Accuracy decreases with distance. Projectiles work with signals and emits them, for easy hooking up from other parts of the code. Meatshielding is now less effective . Impact sound is now configurable per projectile. High risk.
76 lines
2.0 KiB
Plaintext
76 lines
2.0 KiB
Plaintext
/turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0)
|
|
if(!target)
|
|
return FALSE
|
|
|
|
if(mover?.movement_type & PHASING)
|
|
return TRUE
|
|
|
|
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
|
|
|
|
//Convenience function for atoms to update turfs they occupy
|
|
/atom/movable/proc/update_nearby_tiles(need_rebuild)
|
|
for(var/turf/simulated/turf in locs)
|
|
SSair.mark_for_update(turf)
|
|
|
|
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 (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1))
|
|
|
|
|
|
/turf/c_airblock(turf/other)
|
|
#ifdef ZASDBG
|
|
ASSERT(isturf(other))
|
|
#endif
|
|
if(((blocks_air & AIR_BLOCKED) || (other.blocks_air & AIR_BLOCKED)))
|
|
return BLOCKED
|
|
|
|
//Z-level handling code. Always block if there isn't an open space.
|
|
#ifdef MULTIZAS
|
|
if(other.z != src.z)
|
|
if(other.z < src.z)
|
|
if(!isopenturf(src)) return BLOCKED
|
|
else
|
|
if(!isopenturf(other)) return BLOCKED
|
|
#endif
|
|
|
|
if(((blocks_air & ZONE_BLOCKED) || (other.blocks_air & ZONE_BLOCKED)))
|
|
if(z == other.z)
|
|
return ZONE_BLOCKED
|
|
else
|
|
return AIR_BLOCKED
|
|
|
|
var/result = 0
|
|
for(var/mm in contents)
|
|
var/atom/movable/M = mm
|
|
result |= M.c_airblock(other)
|
|
if(result == BLOCKED) return BLOCKED
|
|
return result
|
|
|
|
/atom/movable
|
|
var/atmos_canpass = CANPASS_ALWAYS
|