Proximity sensing refactor (#425)

This commit is contained in:
CitadelStationBot
2017-04-16 17:15:29 -05:00
committed by TalkingCactus
parent dfd470adf9
commit 64068fc614
12 changed files with 160 additions and 144 deletions
+16 -7
View File
@@ -23,6 +23,12 @@
/obj/effect/blob_act()
return
/obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
return 0
/obj/effect/experience_pressure_difference()
return
/obj/effect/ex_act(severity, target)
if(target == src)
qdel(src)
@@ -37,12 +43,15 @@
if(prob(25))
qdel(src)
/obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
return 0
/obj/effect/experience_pressure_difference()
return
/obj/effect/singularity_act()
qdel(src)
return 0
return 0
/obj/effect/abstract/ex_act(severity, target)
return
/obj/effect/abstract/singularity_pull()
return
/obj/effect/abstract/singularity_act()
return
+97
View File
@@ -0,0 +1,97 @@
/datum/proximity_monitor
var/atom/host //the atom we are tracking
var/atom/last_host_loc
var/list/checkers //list of /obj/effect/abstract/proximity_checkers
var/current_range
var/ignore_if_not_on_turf //don't check turfs in range if the host's loc isn't a turf
/datum/proximity_monitor/New(atom/_host, range, _ignore_if_not_on_turf = TRUE)
host = _host
last_host_loc = _host.loc
ignore_if_not_on_turf = _ignore_if_not_on_turf
SetRange(range)
/datum/proximity_monitor/Destroy()
host = null
QDEL_LIST(checkers)
return ..()
/datum/proximity_monitor/proc/HandleMove()
var/atom/_host = host
var/atom/new_host_loc = _host.loc
if(last_host_loc != new_host_loc)
last_host_loc = new_host_loc //hopefully this won't cause GC issues with containers
var/curr_range = current_range
SetRange(curr_range, TRUE)
if(curr_range)
testing("HasProx: [host] -> [host]")
_host.HasProximity(host) //if we are processing, we're guaranteed to be a movable
/datum/proximity_monitor/proc/SetRange(range, force_rebuild = FALSE)
if(!force_rebuild && range == current_range)
return FALSE
. = TRUE
current_range = range
var/list/old_checkers = checkers
var/old_checkers_len = LAZYLEN(old_checkers)
var/atom/host_loc = host.loc
var/atom/loc_to_use = ignore_if_not_on_turf ? host_loc : get_turf(host)
if(!isturf(loc_to_use)) //only check the host's loc
if(range)
var/obj/effect/abstract/proximity_checker/pc
if(old_checkers_len)
pc = old_checkers[old_checkers_len]
--old_checkers.len
else
pc = new(host_loc, src)
checkers = list(pc) //only check the host's loc
return
var/list/turfs = RANGE_TURFS(range, loc_to_use)
var/old_checkers_used = min(turfs.len, old_checkers_len)
//reuse what we can
for(var/I in 1 to old_checkers_len)
if(I <= old_checkers_used)
var/obj/effect/abstract/proximity_checker/pc = old_checkers[I]
pc.loc = turfs[I]
else
qdel(old_checkers[I]) //delete the leftovers
LAZYCLEARLIST(old_checkers)
//create what we lack
var/list/checkers_local = list()
for(var/I in (old_checkers_used + 1) to turfs.len)
checkers_local += new /obj/effect/abstract/proximity_checker(turfs[I], src)
checkers = checkers_local
/obj/effect/abstract/proximity_checker
var/datum/proximity_monitor/monitor
/obj/effect/abstract/proximity_checker/Initialize(mapload, datum/proximity_monitor/_monitor)
. = ..()
if(_monitor)
monitor = _monitor
else
stack_trace("proximity_checker created without proximity_monitor")
qdel(src)
/obj/effect/abstract/proximity_checker/Destroy()
monitor = null
return ..()
/obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM)
set waitfor = FALSE
var/datum/proximity_monitor/M = monitor
if(!M.current_range)
return
var/atom/H = M.host
testing("HasProx: [H] -> [AM]")
H.HasProximity(AM)
+3 -15
View File
@@ -227,7 +227,6 @@
layer = MOB_LAYER
var/obj/item/clothing/mask/facehugger/child
/obj/structure/alien/egg/Initialize(mapload)
..()
update_icon()
@@ -235,15 +234,10 @@
child = new(src)
if(status == GROWING)
addtimer(CALLBACK(src, .proc/Grow), rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME))
if(status == GROWN)
add_to_proximity_list(src, 1)
proximity_monitor = new(src, status == GROWN ? 1 : 0)
if(status == BURST)
obj_integrity = integrity_failure
/obj/structure/alien/egg/Destroy()
remove_from_proximity_list(src, 1)
. = ..()
/obj/structure/alien/egg/update_icon()
..()
switch(status)
@@ -283,12 +277,12 @@
/obj/structure/alien/egg/proc/Grow()
status = GROWN
update_icon()
add_to_proximity_list(src, 1)
proximity_monitor.SetRange(1)
//drops and kills the hugger if any is remaining
/obj/structure/alien/egg/proc/Burst(kill = TRUE)
if(status == GROWN || status == GROWING)
remove_from_proximity_list(src, 1)
proximity_monitor.SetRange(0)
status = BURST
update_icon()
flick("egg_opening", src)
@@ -307,12 +301,6 @@
child.Attach(M)
break
/obj/structure/alien/egg/Moved(oldloc)
remove_from_proximity_list(oldloc, 1)
if(status == GROWN)
add_to_proximity_list(src, 1)
return ..()
/obj/structure/alien/egg/obj_break(damage_flag)
if(!(flags & NODECONSTRUCT))
if(status != BURST)