This may help, I dunno
This divides minimap into boxes, and looks for yellow dots in them (then it determines which are the bankers in port phastmatys based on distances between the dots, but thats not important).
procedure findyellows (var fx, fy:integer; PointsToFind,width,basex,basey,endx,endy:integer);
var
box :array of ybox;
ypoint : array of tehpoint;
com:array [1..300] of combo;
x,d,e,f,i,g,nob,{gx,gy,}currentpoint,row,prow,col,nor,noc:integer;//var
//x,d,nob,gx,gy,currentpoint,row,prow,col,nor,noc:integer;
begin
noc:=(( (endx-basex) - (width mod (endx-basex)))/width)+1;
nor:=(( (endy-basey) - (width mod (endy-basey)))/width)+1;
//noc:=round( (endx-basex)/width );
//nor:=round( (endy-basey)/width );
nob:=nor*noc;
setarraylength(box, ((nob)+2));
repeat
x:=x+1;
if ((x+noc) mod noc)>0 then
col:=((x+noc) mod noc);
if ((x+noc) mod noc) =0then
col:=noc;
prow:=0;
repeat
prow:=prow+1;
until ( x<=(noc*prow));
row:=prow;
box[x].x1:=(basex+ ((col-1)*width) );
box[x].x2:=(basex+(col*width));
box[x].y1:=(basey+ ((row-1)*width) );
box[x].y2:=(basey+(row*width));
box[x].cx:=round((box[x].x2+box[x].x1)/2);
box[x].cy:=round((box[x].y2+box[x].y1)/2);
box[x].active:=true;
{
movemouse(box[x].x1,box[x].y1);
holdmouse(box[x].x1,box[x].y1,true);
movemouse(box[x].x2,box[x].y2);
releasemouse(box[x].x2,box[x].y2,true);
}
until x>=nob;
currentpoint:=1;
d:=0;
setarraylength(ypoint, pointstofind+1);
repeat
d:=d+1;
if (box[d].active) then
begin
if findcolor(gx,gy,195836,box[d].x1,box[d].y1,box[d].x2,box[d].y2) then
begin
ypoint[currentpoint].x :=gx;
ypoint[currentpoint].y :=gy;
currentpoint:=currentpoint+1;
box[d].active:=false;
end;
end;
until (( currentpoint= pointstofind)or (d=nob));
e:=0;
repeat
e:=e+1;
//writeln(inttostr(ypoint[e].x)+' '+inttostr(ypoint[e].y));
//if not((ypoint[e].x = 0) and (ypoint[e].y = 0)) then ypoint[e].active:=true;
until e=16;
//writeln(' all points');
e:=0;
repeat
f:=f+1;
g:=0;
repeat
g:=g+1;
e:=e+1;
//writeln(inttostr(f)+' '+inttostr(g)+' '+inttostr(e));
com[e].point1:=f;
com[e].point2:=g;
com[e].x1:=ypoint[f].x;
com[e].y1:=ypoint[f].y;
com[e].x2:=ypoint[g].x;
com[e].y2:=ypoint[g].y;
if not((com[e].x1=0) or (com[e].y1=0) or (com[e].x2=0) or (com[e].y2=0)) then com[e].active:=true;
until( (g=16) or (e=256));
until ((f=16) or (e=256));
e:=0;
repeat
e:=e+1;
com[e].dist:=Round(Sqrt(Sqr(com[e].x1 - com[e].x2) + Sqr(com[e].y1 - com[e].y2)))
if ((com[e].dist=0) or (com[e].dist>20)) then com[e].active:=false;
i:=0;
repeat
i:=i+1;
if ((com[e].active) and (com[i].active))then
begin
if ((com[e].point1=com[i].point2)and (com[e].point2=com[i].point1)) then com[i].active:=false;
end;
until i=256;
if com[e].dist=1 then com[e].active:=false;
//if com[e].active then writeln(inttostr(com[e].point1)+' '+inttostr(com[e].point2)+' '+inttostr(com[e].dist));
until e=256;
e:=0;
repeat
e:=e+1;
if com[e].active then
begin
if (com[e].dist <6 ) then
begin
i:=0;
repeat
i:=i+1;
if ((com[i].point1=com[e].point1) or (com[i].point1=com[e].point2) or (com[i].point2=com[e].point1) or (com[i].point2=com[e].point2))then
begin
if com[i].dist>7 then
begin
fx:=com[e].x1;
fy:=com[e].y1;
end;
end;
until i=256;
end;
end;
until e=256;
end;
That may use some of the following, I don't remember and too tired to check
{
type ybox = record
x1,y1,x2,y2,cx,cy:integer;
active:boolean;
end;}
{
type tehpoint = record
x,y :integer;
active : boolean;
end; }
{
type combo = record
point1,point2,x1,y1,x2,y2,dist:integer;
active:boolean;
end; }
//var //gx,gy:integer;
type tehpointfur = record
x,y,dist :integer;
active : boolean;
end;