ID:1998209
 
Applies to:DM Language
Status: Open

Issue hasn't been assigned a status value.
so the idea is that we expand the "view string" format that all the sight-based functions allow (range, orange, view, oview, viewers, oviewers, hearers, ohearers). You would be able to provide offset (based on world.icon_size) to the center in the string, currently you can accomplish something similar by using locate(), but this behavior can be faulty when you rely on things like view(), where the sight of the src matters. choosing a different center could have different outcomes.

as Kaiochao explained it better than I could:
[3:52:27 PM] Kaiochao: you want a sub-section of a mob's view that isn't necessarily centered on the mob itself
[3:52:39 PM] Kaiochao: but takes into account the mob's sight

The alternatives to sight-based subset of this could involve creating multiple lists; like, bounds(thing) & view(thing); or some strenuous filtering based on their x/y. Either way, I feel this would be more efficient if native. Considering the procedures all accept a view string, I think expanding the syntax might make sense.

Maybe something like the syntax in the range_test_proposed, or something more like a subset of screen_loc where everything is relative to CENTER.

mob/verb
range_test_proposed()
var/off_x = !!(dir&EAST)
var/off_y = !!(dir&NORTH) // range could take "2:1x3:0"
var/_view = (dir & (EAST|WEST))? "2:[off_x]x3:[off_y] " : "3:[off_x]x2:[off_y]"
overlayTargets(range(src,_view))

range_test_current()
var/off_x = !!(dir&EAST)
var/off_y = !!(dir&NORTH)
var/_view = (dir & (EAST|WEST))? "2x3" : "3x2"
overlayTargets(range(locate(x+off_x, y+off_y, z),_view))

proc/overlayTargets(list/targets)
for(var/atom/x in world) if(x.icon)
if((x in targets)) x.overlays += /obj/over
else x.overlays = new

+0.5