diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 4f0e9158101..e127a5f3060 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -1,3 +1,10 @@ +//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a +#define RANGE_TURFS(RADIUS, CENTER) \ + block( \ + locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ + locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ + ) + //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 /proc/get_area(O) @@ -24,6 +31,20 @@ return A return 0 +/proc/get_areas_in_range(dist=0, atom/center=usr) + if(!dist) + var/turf/T = get_turf(center) + return T ? list(T.loc) : list() + if(!center) + return list() + + var/list/turfs = RANGE_TURFS(dist, center) + var/list/areas = list() + for(var/V in turfs) + var/turf/T = V + areas |= T.loc + return areas + // Like view but bypasses luminosity check /proc/get_hear(range, atom/source) @@ -423,10 +444,3 @@ new_character.key = G_found.key return new_character - -//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a -#define RANGE_TURFS(RADIUS, CENTER) \ - block( \ - locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ - ) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 645485ad3a9..5dfc704757e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1175,7 +1175,6 @@ B --><-- A return L - /atom/proc/contains(var/atom/A) if(!A) return 0 diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index 5e9043f8d04..25c73a7f0ed 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -87,10 +87,9 @@ STI KALY - blind /datum/disease/wizarditis/proc/teleport() - var/list/theareas = list() - for(var/area/AR in ultra_range(80, affected_mob, 1)) - if(theareas.Find(AR) || istype(AR,/area/space)) continue - theareas += AR + var/list/theareas = get_areas_in_range(80, affected_mob) + for(var/area/space/S in theareas) + theareas -= S if(!theareas||!theareas.len) return diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index a1ce789e73a..60b088ebc97 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -35,11 +35,9 @@ /obj/item/mecha_parts/mecha_equipment/wormhole_generator/action(atom/target) - if(!action_checks(target) || src.loc.z == ZLEVEL_CENTCOM) return - var/list/theareas = list() - for(var/area/AR in ultra_range(100, chassis, 1)) - if(AR in theareas) continue - theareas += AR + if(!action_checks(target) || src.loc.z == ZLEVEL_CENTCOM) + return + var/list/theareas = get_areas_in_range(100, chassis) if(!theareas.len) return var/area/thearea = pick(theareas)