Here's what I ended up doing if anyone's interested.
This finds the red (230-260 ish) that is closest to the furnace symbol (unless it's too close which means it's a drop, in theory if a drop is closer than the door but further than 'too close' it could screw up, although that hasn't happened so far, but I may add finddtmrotated or something to distinguish the door (red line) from drop (red circle)). Please excuse the messy code, it's based on my bank finder and I converted it quickly.
SCAR Code:
procedure findreds (var fx, fy:integer; PointsToFind,width,basex,basey,endx,endy:integer);
var
box :array of ybox;
ypoint : array of tehpointfur;
x,d,e,f,i,g,rx,ry,tehcolor,lowest,lowestp,nob,{gx,gy,}currentpoint,row,prow,col,nor,noc:integer;//var
//x,d,nob,gx,gy,currentpoint,row,prow,col,nor,noc:integer;
begin
repeat
if not(Loggedin) then break;
if(TimeFromMark(Mark)>600000) then begin Logout; Exit; end;
Until(FindSymbol(rx,ry,'furnace'));
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
tehcolor:=210;
repeat
tehcolor:=tehcolor+1;
//if findcolor(gx,gy,tehcolor,box[d].x1,box[d].y1,box[d].x2,box[d].y2) then
until (findcolor(gx,gy,tehcolor,box[d].x1,box[d].y1,box[d].x2,box[d].y2) or (tehcolor>=260));
if (findcolor(gx,gy,tehcolor,box[d].x1,box[d].y1,box[d].x2,box[d].y2))then
begin
ypoint[currentpoint].x :=gx;
ypoint[currentpoint].y :=gy;
ypoint[currentpoint].dist:=Round(Sqrt(Sqr(ypoint[currentpoint].x - rx) + Sqr(ypoint[currentpoint].y- ry)))
currentpoint:=currentpoint+1;
box[d].active:=false;
end;
end;
until (( currentpoint= pointstofind)or (d=nob));
e:=0;
repeat
e:=e+1;
if (not(ypoint[e].x=0) and not(ypoint[e].y=0)) then
ypoint[e].active:=true;
if ypoint[e].dist<5 then
ypoint[e].active:=false;
until e=pointstofind;
e:=0;
lowest:=1000;
repeat
e:=e+1;
if ypoint[e].active then
begin
if ypoint[e].dist<lowest then
lowestp:=e;
lowest:=min(lowest, ypoint[e].dist);
end;
until e=pointstofind;
gx:=ypoint[lowestp].x;
gy:=ypoint[lowestp].y;
end;
clicks the door, gets either the square right above or right below
SCAR Code:
Mouse(gx,gy,0,0,True);
wait(2000+random(500));
waits til you're not moving (countflag didn't work when the door closed after opening because the char stops at the door but doesn't get to the flag)
SCAR Code:
procedure waittilstill;
var
points: array [0..17] of tpoint;
color: array [0..17] of integer;
oldcolor: array [0..17] of integer;
gh,hg,same: integer;
begin
points[1].x:=600
points[1].y:=30
points[2].x:=630
points[2].y:=30
points[3].x:=660
points[3].y:=30
points[4].x:=690
points[4].y:=30
points[5].x:=600
points[5].y:=60
points[6].x:=630
points[6].y:=60
points[7].x:=660
points[7].y:=60
points[8].x:=690
points[8].y:=60
points[9].x:=600
points[9].y:=90
points[10].x:=630
points[10].y:=90
points[11].x:=660
points[11].y:=90
points[12].x:=690
points[12].y:=90
points[13].x:=600
points[13].y:=120
points[14].x:=630
points[14].y:=120
points[15].x:=660
points[15].y:=120
points[0].x:=690
points[0].y:=120
gh:=17;
repeat
wait(50);
gh:=gh+1;
hg:=(gh mod 16);
oldcolor[hg]:=color[hg];
color[hg]:=getcolor(points[hg].x,points[hg].y);
if (color[hg]=oldcolor[hg]) then same:=same+1;
if not(color[hg]=oldcolor[hg]) then same:=0;
until same>=10;
end;
looks in a fairly small area for door, and opens if needed (btw if a door is open, it says close door, and vice versa)
SCAR Code:
procedure datdoor;
var cpoint:array [0..133] of tpoint;
g,j,dx,dy:integer;
begin
j:=0;
repeat
j:=j+1;
wait(10);
mmouse(255+random(40),85+random(95),0,0)
until ((IsUpTextMulti('Door','oor','oo')) or (j=100));
if IsUpTextMulti('Open','pen','Ope') then
begin
GetMousePos(Dx, Dy);
Mouse(Dx, Dy, 0, 0, False);
if ChooseOption(Dx, Dy, 'pen') then
end;
end;
Then click furnace/bank symbol