Simba Code:
program PortSarimDoorOpener; // by beginner5
{ Opening doors to Port Sarim fishing shop. Edge of doors must be visible }
{$DEFINE SRL5}
{$DEFINE SMART}
{$i srl/srl.simba}
var
tries: integer;
opened : boolean;
procedure start;
begin
ClearDebug;
Smart_Server := 139;
Smart_Members := True;
Smart_Signed := True;
Smart_SuperDetail := False;
activateclient;
SetupSRL;
end;
//Returns random point in box -- by beginner5
function RandomPointInBox (box :Tbox):Tpoint;
begin
Result.x:=box.x1+random(box.x2-box.x1);
Result.y:=box.y1+random(box.y2-box.y1);
end;
// Sorting ATPA by x or y position of SubTPA's middle points. -- by beginner5
procedure SortATPAbyMidTPA(var ATPA: T2DPointArray; SortByX , SortUp : boolean);
var a,hi ,x,y:integer;
SortArr :Tintegerarray;
begin
hi := High(ATPA);
setlength(SortArr,hi+1);
if (SortByX) then
begin
for a:= 0 to hi do
begin
MiddleTPAEx(ATPA[a],x,y);
SortArr[a]:=x;
end;
end else begin
for a:= 0 to hi do
begin
MiddleTPAEx(ATPA[a],x,y);
SortArr[a]:=y;
end;
end;
QuickATPASort(SortArr,ATPA,0,hi,SortUp);
end;
// Result is TPA of that points from tpa1 ,which has in neighborhood any point from tpa2. -- by beginner5
function AND_TPA (tpa1 , tpa2 :TpointArray ; MinDist ,MaxDist : extended) : TPointArray;
var
a : integer;
temp_tpa1 :tPointarray;
begin
Setlength(Result,0);
for a:=0 to High(tpa2) do
begin
temp_tpa1 := tpa1; // Don't want FilterPointsDist overwrite tpa1
FilterPointsDist(temp_tpa1,MinDist,MaxDist,tpa2[a].x,tpa2[a].y);
CombineTPAWrap(Result,temp_tpa1,Result);
end;
// Need here function which remove duplicated points from tpa.
end;
function FindDoor : T2dPointArray;
var
WallColor , DoorEdgeColor ,AdditionalDoorColor ,AdditionalDoorColor2 : integer;
TPA1 ,TPA2 ,TPA3 ,TPA4 : TPointArray;
houseBox :TBox;
begin
/////////////SETUP/////////////
WallColor := 13955062;
DoorEdgeColor := 3627875 ;
AdditionalDoorColor := 3361102 ;
AdditionalDoorColor2 := 604482 ;
///////////////////////////////
if FindColorstolerance(TPA4,WallColor,msx1,msy1,msx2,msy2,15) then
houseBox :=GetTpaBounds(TPA4) else writeln('Cannot find wall - update color!');
FindColorstolerance(TPA1,DoorEdgeColor ,houseBox.x1,houseBox.y1,houseBox.x2+10,houseBox.y2+10,10);
FindColorstolerance(TPA2,AdditionalDoorColor ,houseBox.x1,houseBox.y1,houseBox.x2+10,houseBox.y2+10,10);
FindColorstolerance(TPA3,AdditionalDoorColor2 ,houseBox.x1,houseBox.y1,houseBox.x2+10,houseBox.y2+10,15);
RAaSTPAEx(TPA1,10,10);
RAaSTPAEx(TPA2,10,10);
RAaSTPAEx(TPA3,10,10);
TPA1:=AND_TPA(TPA1,TPA2,0,15);
TPA1:=AND_TPA(TPA1,TPA3,0,15);
TPAtoATPAExWrap(TPA1,50,2,Result);
if (High(Result)=-1) then
begin
writeln('ATPA is empty! Something with colors');
terminatescript;
end;
SortATPAbyMidTPA(Result,False,False);
end;
function OpenDoor (ATPA : T2dPointArray) : Boolean;
var a, x ,y : integer;
TPAbox : Tbox ;
begin
for a:=0 to 5 do
begin
TPAbox := GetTpaBounds(ATPA[a]);
x:=RandomPointInBox(TPAbox).x;
y:=RandomPointInBox(TPAbox).y;
MMouse(x,y,1,1);
wait(100+random(200));
if IsUpTextMultiCustom(['open','oor']) then break;
wait(100+random(200));
end;
Result := IsUpTextMultiCustom(['open','oor']);
end;
/////////////////////////////// Main Loop /////////////////////////
begin
start;
ClickNorth(0);
for tries:=0 to 5 do
begin
if (OpenDoor (FindDoor ) ) then
begin
ClickMouse2(0);
opened := True;
break;
end else writeln('Opening failed');
end;
if (opened) then
writeln ('Doors was opened!') else writeln ('Cannot open doors ,maybe they are already opened?');
end.