Well, technically, if I got WalkTPA working perfectly, this would be very easy.
So far it looks like this:
General crap added at the top of the script:
const
Split_TPAtoATPA = 1;
Split_TPAtoATPAEx = 2;
Split_SplitTPA = 3;
Split_SplitTPAEx = 4;
const
Sort_ATPAFrom = 1;
Sort_LargeFirst = 2;
Sort_SmallFirst = 3;
Then the actual type:
tWalkInfo = record
Color, Tolerance :Integer;
XMod, YMod :Integer;
FlagDist :Integer;
SplitMethod, SortMethod :Integer;
CTS2 :Boolean;
HueMod, SatMod :Extended;
Filter :Boolean;
StartRadial, EndRadial :Integer;
MinRadius, MaxRadius :Integer;
SortPoint :TPoint;
SplitDistance :TIntegerArray;
end;
And the function itself:
{*******************************************************************************
function WalkTPA(...) : Boolean;
by: 3Garrett3
Description: Uses TPA methods to walk to a point based on various info.
*******************************************************************************}
Function WalkTPA(WalkInfo : tWalkInfo) : Boolean;
Var
TPA: TPointArray;
TDPA: T2DPointArray;
I, H, X, Y, CTS: Integer;
Begin
If Not LoggedIn Then Exit;
cts := GetColorToleranceSpeed;
if WalkInfo.CTS2 then
begin
ColorToleranceSpeed(2);
SetColorspeed2Modifiers(WalkInfo.HueMod, WalkInfo.SatMod);
end else
ColorToleranceSpeed(1);
FindColorsTolerance(TPA, WalkInfo.Color, MMX1, MMY1, MMX2, MMY2, WalkInfo.Tolerance);
If Length(TPA) = 0 Then
begin
Writeln('Didn''t find the colour, quitting walktpa');
Exit;
end;
Writeln('Found colour, length of array = ' + IntToStr(Length(TPA)));
if WalkInfo.Filter then
FilterPointsPie(TPA, WalkInfo.StartRadial, WalkInfo.EndRadial, WalkInfo.MinRadius, WalkInfo.MaxRadius, MMCx, MMCy);
Case WalkInfo.SplitMethod of
Split_TPAtoATPA:
TDPA := TPAToATPA(TPA, WalkInfo.SplitDistance[0]);
Split_TPAtoATPAEx:
TDPA := TPAToATPAEx(TPA, WalkInfo.SplitDistance[0], WalkInfo.SplitDistance[1]);
Split_SplitTPA:
TDPA := SplitTPA(TPA, WalkInfo.SplitDistance[0]);
Split_SplitTPAEx:
TDPA := SplitTPAEx(TPA, WalkInfo.SplitDistance[0], WalkInfo.SplitDistance[1]);
end;
Case WalkInfo.SortMethod of
Sort_ATPAFrom:
SortATPAFromFirstPoint(TDPA, WalkInfo.SortPoint);
Sort_LargeFirst:
SortATPASize(TDPA, True);
Sort_SmallFirst:
SortATPASize(TDPA, False);
end;
Wait(10);
try
DebugATPABounds(TDPA);
except end;
H := High(TDPA);
For i := 0 To H Do
Begin
MiddleTPAEx(TDPA[i], x, y);
If rs_OnMinimap(x,y) Then
Begin
Mouse(x + WalkInfo.XMod , y + WalkInfo.YMod, 2, 2, True);
Wait(RandomRange(200,300));
FFlag(WalkInfo.FlagDist);
Result := True;
Wait(200 + Random(80));
Exit;
End;
End;
Result := False;
End;
It all kinda looks bad and such, but here is how you use it (I got the idea from MSI ;))
Function LoadTPAData(WalkStep : Integer) : tWalkInfo;
begin
Case WalkStep of
0: // First Step to Stiles
with Result do
begin
Color := AutoColorTree;
Tolerance := 1;
XMod := 0;
YMod := 5;
FlagDist := 0;
SplitMethod := Split_TPAtoATPA;
SortMethod := Sort_ATPAFrom;
CTS2 := False;
Filter := True;
StartRadial := 200;
EndRadial := 340;
MinRadius := 30;
MaxRadius := 70;
SortPoint := Point(MMX1, MMCy);
SplitDistance := [20];
end;
1: // Second Step to Stiles
with Result do
begin
Color := AutoColorTree;
Tolerance := 1;
XMod := 0;
YMod := 0;
FlagDist := 0;
SplitMethod := Split_TPAtoATPA;
SortMethod := Sort_ATPAFrom;
SortPoint := Point(MMX1 + 38, MMCy + 38);
CTS2 := False;
Filter := False;
SplitDistance := [25];
end;
2: // Third Step to Stiles
with Result do
begin
Color := 9865091;
Tolerance := 6;
XMod := -25;
YMod := 5;
FlagDist := 0;
SplitMethod := Split_TPAtoATPAEx;
SortMethod := Sort_ATPAFrom;
CTS2 := True;
HueMod := 0.26;
SatMod := 0.52;
Filter := True;
StartRadial := 150;
EndRadial := 270;
MinRadius := 20;
MaxRadius := 70;
SortPoint := Point(MMX1 + 38, MMCy + 38);
SplitDistance := [35,30];
end;
3: // Fourth Step to Stiles
with Result do
begin
Color := 1265453;
Tolerance := 6;
XMod := 0;
YMod := 0;
FlagDist := 0;
SplitMethod := Split_TPAtoATPA;
SortMethod := Sort_ATPAFrom;
CTS2 := True;
HueMod := 0.61;
SatMod := 1.61;
Filter := True;
StartRadial := 180;
EndRadial := 270;
MinRadius := 40;
MaxRadius := 70;
SortPoint := Point(MMX1, MMY2);
SplitDistance := [10];
end;
4,5: // Fifth, Sixth Step to Stiles
with Result do
begin
Color := AutoColorTree;
Tolerance := 1;
XMod := 5;
YMod := 0;
FlagDist := 0;
SplitMethod := Split_SplitTPA;
SortMethod := Sort_ATPAFrom;
CTS2 := False;
Filter := True;
StartRadial := 180;
EndRadial := 360;
MinRadius := 40;
MaxRadius := 70;
SortPoint := Point(MMX1, MMCy);
SplitDistance := [5];
end;
6: // Last Step to Stiles
with Result do
begin
Color := 1265453;
Tolerance := 6;
XMod := 0;
YMod := 3;
FlagDist := 0;
SplitMethod := Split_TPAtoATPAEx;
SortMethod := Sort_ATPAFrom;
CTS2 := True;
HueMod := 0.61;
SatMod := 1.61;
Filter := True;
StartRadial := 150;
EndRadial := 270;
MinRadius := 20;
MaxRadius := 70;
SortPoint := Point(MMCx, MMY2);
SplitDistance := [10,10];
end;
End;
end;
Function WalkToStiles : Boolean;
var
i : Integer;
begin
for I := 0 to 6 do
begin
Result := WalkTPA(LoadTPAData(i));
if not Result then break;
end;
end;
It's not the best ever, but it really does work well. I've got almost flawless colour walking to Stiles (my KARAMJA script), and it only took about 30 minutes to get all the data and test it. It would take forever to get it all another way.