It uses red and blue tiles in the inventory to find which size the window is and where the slots are.
Printable View
It uses red and blue tiles in the inventory to find which size the window is and where the slots are.
share? :p
You requested it... code is extremely sloppy and has debugging paint in it, but you can easily remove that.
Simba Code:program newprogram;
{$i SRL/Srl.simba}
var
W1, H1, DebugBMP, i: Integer;
TestBox, Inv: TBox;
//By Bandland100, modified to shift mouse speeds after every step
Procedure SuperWindMouse(xs, ys, xe, ye, gravity, wind, minWait, maxWait, maxStep, targetArea: extended);
Var
veloX,veloY,windX,windY,veloMag,dist,randomDist,lastDist,step: extended;
lastX,lastY,MSP,W: integer;
sqrt2,sqrt3,sqrt5: extended;
Begin
MSP := MouseSpeed;
sqrt2:= sqrt(2);
sqrt3:= sqrt(3);
sqrt5:= sqrt(5);
While hypot(xs - xe, ys - ye) > 1 Do
Begin
dist:= hypot(xs - xe, ys - ye);
wind:= minE(wind, dist);
If dist >= targetArea Then
Begin
windX:= windX / sqrt3 + (random(round(wind) * 2 + 1) - wind) / sqrt5;
windY:= windY / sqrt3 + (random(round(wind) * 2 + 1) - wind) / sqrt5;
End Else
Begin
windX:= windX / sqrt2;
windY:= windY / sqrt2;
If (maxStep < 3) Then
Begin
maxStep:= random(3) + 3.0;
End Else
Begin
maxStep:= maxStep / sqrt5;
End;
End;
veloX:= veloX + windX;
veloY:= veloY + windY;
veloX:= veloX + gravity * (xe - xs) / dist;
veloY:= veloY + gravity * (ye - ys) / dist;
if hypot(veloX, veloY) > maxStep then
Begin
randomDist:= maxStep / 2.0 + random(round(maxStep) div 2);
veloMag:= sqrt(veloX * veloX + veloY * veloY);
veloX:= (veloX / veloMag) * randomDist;
veloY:= (veloY / veloMag) * randomDist;
End;
lastX:= Round(xs);
lastY:= Round(ys);
xs:= xs + veloX;
ys:= ys + veloY;
Case Random(50) Of
1..25: W := (MSP + (Random((MSP/4))));
26..50: W := (MSP - (RandomRange((MSP/2), MSP-1)));
End;
If (W < 1) Then
W := 1;
If (lastX <> Round(xs)) Or (lastY <> Round(ys)) Then
MoveMouse(Round(xs), Round(ys));
step:= hypot(xs - lastX, ys - lastY);
//W := round((maxWait - minWait) * (step / maxStep) + minWait);
wait(W);
lastdist:= dist;
End;
If (Round(xe) <> Round(xs)) or (Round(ye) <> Round(ys)) Then
MoveMouse(Round(xe), Round(ye));
MouseSpeed := MSP;
End;
Procedure HumanMMouse(eX, eY, ranX, ranY: Integer);
Var
randSpeed: extended;
X,Y,X2,Y2,j,Dist,MP: integer;
Begin
j := MouseSpeed;
GetMousePos(X, Y);
Dist := Distance(X, Y, eX, eY);
MP := Round(Dist/150);
If MP < 0 Then
MP := 1;
randSpeed := (random(MouseSpeed) / 2.0 + MouseSpeed) / 10.0;
X2 := RandomRange(eX-(j*MP), eX+(j*MP));
Y2 := RandomRange(eY-(j*MP), eY+(j*MP));
SuperWindMouse(X, Y, X2, Y2, 11, 8, 10.0 / randSpeed, 12.0 / randSpeed, 10.0 * randSpeed, 10.0 * randSpeed);
GetMousePos(X, Y);
MMouse(eX, eY, ranX, ranY);
MouseSpeed := j;
End;
procedure DrawBox(Box: TBox);
var
x, y: Integer;
begin
for x := Box.x1 to Box.x2 do
begin
FastSetPixel(DebugBMP,x,Box.y1,ClYellow)
FastSetPixel(DebugBMP,x,Box.y2,ClYellow)
end;
for y := Box.y1 to Box.y2 do
begin
FastSetPixel(DebugBMP,Box.x1,y,ClYellow)
FastSetPixel(DebugBMP,Box.x2,y,ClYellow)
end;
end;
function FindInv: TBox;
var
RedTile, BlueTile, x, y, X1, Y1, X2, Y2: Integer;
Box, Box2: TBox;
begin
RedTile := BitmapFromString(38, 34, 'meJyVV0uP20YMPrWJX5L27fVDlq2HHyPZ3mTtXe9uixTNreceiqAokOSQW3LZLJBf0J/dj+SIGsubFgUIYcSh5huSHzmjzQ9/X7eeNq1vm+Z35brxb7P/Q1pPuybBjXr+eHg6YYnDMx7I81k5q43HA5Lv25+6Nqvz3zeNb4DrnrzonvzYO3sB6fNTpX/+8nAsg8FFw509FMyK8PokibeDs4CGcnjxMuw2IKPLxqjXJLlsVNJrRqLhAWTcb0Eiq3/OuFwBYyw7vGgQYudh6z8ikvJVOmylYVue2cgOrEYlbCc8yNRSDcTYsdepmGeH3eb06Ket9zWLzgQuIZvOfOxNR1inhec86tBz7IlSBOvMoo5MqY3KfNyBQTn2xAD755g0Z8Gbrf91llwS3KAJ4wVLHvuLciyvpJnIa1v1ZA+9nWrnsWvfcc2mETbZnvQb+cmvW/9plvQkVpgtUt9MvCIN8tjLJ+0i8TCARoWnAjwheF1NyRIfuja1T/AKN2EDH4F44z/O4kvAiSO0SHa8zLCOv0x93kDHQM8iQKIU+/8UGK+yAIjwMR0C8e2NRDWkmMtWYUNwWbBMq6+KJDDlIqvsCOLMBrIB2Ki9Isq2FdEcv70JHoGYcaI5qsH+DvdeFQWI69mRi6he1+CWiVckiImvPm5PP8/ZRyAi3Zw4u1v9djWlOKuP5D6LAMFMslDNlhrZoSFqERWBYk7fbE++5NM+uEo+TiiP+omIBHDp7Fy2hKmCI8aDQEFFT4PEK6NNUQVjKaqE+DnPCHHGSkEUH/VbG59qD8fCInmlFJch1VeXWoJo88iIJutnXKeaR3wlC8or4JC1q9kxRPdQxB3jhFHXN7ENqSmzY+KORQxbQLyBj9OBjerY5rHGAfHl1eL42pxKhCXaMoXNVLzlaDM/A83vgY9fVvOR9CWpDkVxs4YNw0FanBfEQAvE5jqzZIOZyyIhc4V49vP2/NN6MZKua1uHFGBqjYn8ZQewMulUcUspccpJxXLbiHSAxdifRh1z/nBz8enKjBmxJT0n368CU7qpzurAOFVv3MLh1Gh+VwwNd2bw6IIQKapUGp4ighVKm1palatueRaS3NS671aKIAotgUKI3QrRzaMG04mwb6teGML9xOpLOuVOQNTlPeaUiMrV9fSo5pSbHfiuvUtcE6JqtWrrc7lXIaLnnD/cDj6sF5FlzsTnk8hp4E5XP/RFSCugbgpqTU+5msDH7m43eH+9jMsuZ89TS7PMFtean1ICgqiu2XMkq/iDJuxmn5pGAtp4Nqrd3e3wIyM251FVj0oG8RF5sZUoJFR0hyS2haZBLYnKHCASc4A4+LhZJfBRzkc6+vft3TzaJKb1FAu7TFz1IlHKPvc6AKI6/LBdJ9LJ5VqiuZNFNFymRESgtOSlm2kr3qNuSacVMdyX+xUQ74bvt+sU6Nrliv2DydZgmR33NJTa1NZUD0V50FT1GJKPd6M/N+wjn8jE1TzeOw0rQmonOajx2mZUiX1C3HrMB9f3yTvJI7pcLY9VQlF9kr5kj/ZSfQpkyrFLHq3HBZ/IhBi/272aagdAVCXdUu9uKt3MmvK24/prD1N1MNNEVFwF4gMQX8+Yq3QHgI96RcTerJTnXaWx+kBOai4KXw1WnL5ywF1uzHf4qM0+/gEfcXel61zENwHmleE7D5rtbER3flHyrMdTuJtJxwugkSkVMXBeqe6SsI2/j3zw+i7665er3zAoBtt1eLsO767C+yt6ykDHrub+QKPjZ43vsew63BWDjelt/gEnhPB5');
BlueTile:= BitmapFromString(38, 34, 'meJyVV91vG0UQf6O1Y58vSRM7/rzzffjsu/M5cVKpr3wqRUigNkDUJFLV0lZIqYAXKiQK4iEqUikPkAdQo4QHnkAp4X+Av4vf7uzOrS+tSqWRtTs7t7+dmd/Mrv85m56dTJ8drz07mr5Qnr546VXk7Hj93783/jqeOi3b7VzqS/G6S309/p/ithfd9ktt1OCr+wnOD7jG4oXG4mvNpQuQlvxlaS1fPD+mQbteMlfPC1ZJ5P5Cbry/cvp0CmgoO/WL3UYJ0lsp9ZplISulXJplhzRyAHFbcxBH6Z9nrHfAGNt26iUg7l5rnh5NEUn6KujMBd0K/YY9NVAalm7Fl4OQLdmAjA17XvLkaqdRvr3dBmLoLBGcL2yqQ9ca9LDPHH6HTlX8uhYpSbBP5FRpiW1Yhm4VBnpskQHOL2NSvrfTOT1aj/wVAdcuw3gkJfFqIz2mqdD0aVphvbCHXi1VEs+0r5pmAweHrPRbpf2b3T8Os8hvUqywmga1uG+lgZ14VtKvpL6FATQscsnGLwTTbCAs8aFpU/gEU7gJG/i4v9v68+dx5K0AjhwRm4QL4xD71MZBTR6gGkMvhYBISfYvFRhnoQ1E+Bh0yp/udn7/aVVEtStiTkeFjYAL7XGQf5X6dqw3ycJ5iLFq0wFgw/aMSMfOEXc6vz1OgRjKRMuo2rMnnJkyChAn0byJyF4X4Ma+lfqISY19PPlhPJQ+AhHplolTp+Vvs4GIM/so3JdCQDCjLOSrWkMnjAW1BBWBcne7ffJ4kgxa4KrwsS/yyJ+QUADHxsnpSFhKZcTkwGZQ0ouBb+loi6iCsfBRIo6TUCBGUkmI5CN/q+KTn2GBWERTkWIdUp6a1CJEiioQfz1I47AVyjrlPOIr2pCmgEPWVqMFCJ8h9aqxEUbeP/ZUSGOdndirKsTu3K2tJhCTQVtF1VV5LHCAfFkbLazHlyjCFG1awmFy3spoS37anF/Tx1tbrV8OxtmwR32JqoNRzKzhwHBQbC43xIALROU6VGSDmckiIrOB2Dx8OJyMetR1VeugAgyUsSC/7gBK+tU8boFIHHOSscw2Qh1g5NYGTvXmB43Dh6PV2JWIc9RzktkqiLWb7CwPYqPqY7NwZGo4v5mEhjuRS4hDEVVRGhYjghVMm0JamatmeaaU3EC5b1YKIRItgQLEJw8iRjTzyME0IlxTVU8Mkf1E6TWdEiMg7LLJnN336k++FIjM1clgvuCUmR34zr2LXCOicrVy6zO5lyN2K0D88UE0GTmKOf2avImMBm509fO+EGkJ1ExBoekxV33pIxDXx57ucuo+VTQLVXFN5C+VACGya+oeCXP+oAmb2RdNwwdtLI7qoy8IsTx08npkMpCPyIuqRCIhoxskUS00sAtJZOYAEWzZ3qw/+izayHz4SPejuPpn7c08qiQGxRQTu2Iv70WkpHOaHUAgfh5dnvjUyelZwrmjTThcsUZEoLjkqZtxK56hrqZTJhheo/cVEA/uh5cnAdC5y6WzF5OqQZ0d8zak2uTWVAyFvmjyeuyWP3pn+du74Yb0Ud7IgquJN3Mb5oTkTnKuxguHYSXOCTHr8foby9/cG1Ae0eUKecwTiuqj9PkztKfqY6BYj03ycD2O5I0MRPh4ZW3AHQBRpXRTvZupNDMb69eO6a+6TNnBkBORcxWI390JrkwjyVXxBoCP/ETE2ZTo+y7XKL1NN7UsihobZDJ9eiC7nCvf8I5A/PqO8BFvV/Gcc+RLQPIqlm8eNNuoJ978pJSrllzC24w6ng0NLbGQgTEVded3K/j3ce31pe/3+59sZRh8+Nbyjc367tXG3rsN/NJg76oam5q9c5rn2oupFkx3Nutbby5//PbifzugMdc=');
if (FindBitmapToleranceIn(BlueTile, X2, Y2, 0, 0, W1-1, H1-1, 100) and
FindBitmapToleranceIn(RedTile, X1, Y1, 0, 0, W1-1, H1-1, 70)) then
begin
Box := IntToBox(X2,Y2,X2+38,Y2+34);
Box2 := IntToBox(X1,Y1,X1+38,Y1+34);
for x := Box.x1 to Box.x2 do
begin
FastSetPixel(DebugBMP,x,Box.y1,ClRed)
FastSetPixel(DebugBMP,x,Box.y2,ClRed)
end;
for y := Box.y1 to Box.y2 do
begin
FastSetPixel(DebugBMP,Box.x1,y,ClRed)
FastSetPixel(DebugBMP,Box.x2,y,ClRed)
end;
for x := Box2.x1 to Box2.x2 do
begin
FastSetPixel(DebugBMP,x,Box2.y1,ClYellow)
FastSetPixel(DebugBMP,x,Box2.y2,ClYellow)
end;
for y := Box2.y1 to Box2.y2 do
begin
FastSetPixel(DebugBMP,Box2.x1,y,ClYellow)
FastSetPixel(DebugBMP,Box2.x2,y,ClYellow)
end;
Result.X1 := X1;
Result.Y1 := Y1;
Result.X2 := X2;
Result.Y2 := Y2;
end;
FreeBitmap(RedTile);
FreeBitmap(BlueTile);
end;
function InvBox2(X1,Y1,X2,Y2,Item: Integer): TBox;
var
x, y, Rows, Cols, RowW, ColW: Integer;
Box: TBox;
begin
Rows := ((Y2 - Y1)/35)+1;
Cols := ((X2 - X1)/42)+1;
RowW := ((Y2 - Y1) / (Rows - 1));
ColW := ((X2 - X1) / (Cols - 1));
Box.X1 := X1+ 4+ ((Item - 1) mod Cols * ColW);
Box.Y1 := Y1+ 2+ ((Item - 1) div Cols * RowW);
Box.X2 := Box.X1 + 34;
Box.Y2 := Box.Y1 + 30;
Result := Box;
end;
procedure Setup;
begin
ClearDebug;
SetupSRL;
end;
Begin
Setup;
GetClientDimensions(W1,H1);
DebugBMP := BitmapFromClient(0,0,W1-1,H1-1);
Inv := FindInv;
TestBox := InvBox2(Inv.X1,Inv.Y1,Inv.X2,Inv.Y2,27);
HumanMMouse( ((TestBox.X2 - TestBox.X1)/2)+TestBox.X1, ((TestBox.Y2 - TestBox.Y1)/2)+TestBox.Y1,
((TestBox.X2 - TestBox.X1)/2), ((TestBox.Y2 - TestBox.Y1)/2) );
//DrawBitmapDebugImg(DebugBMP);
//DisplayDebugImgWindow(W1-1, H1-1);
FreeBitmap(DebugBMP);
End.
Just remember to set your red tile as the top left tile and your blue tile as the bottom right tile. (Has to be the farthest right tile, if it comes out unevenly)
Also don't have anything in the slots with the colored tiles or it won't find it. Script was meant to really be calibrated once (Maybe even save them as settings somewhere) and then use the coordinates for all future tasks.
Sweet mate! ;)
Does it do something like make a TPA of the invslot color and then add a bit to the bounds?
http://i.imgur.com/BVw7pXN.png
Simba Code:function GetInvBox: TBox;
var
InvSlotsTPA: TPointArray;
tInvBox: TBox;
begin
FindColors(InvSlotsTPA, 2234891, 1, 1, 798, 598);
if (Length(InvSlotsTPA) < 1) then exit;
tInvBox := GetTPABounds(InvSlotsTPA);
Result := IntToBox(tInvBox.x1 - 10, tInvBox.y1 - 10, tInvBox.x2 + 10, tInvBox.y2 + 10)
end;
I just set the coords of each box in the include... could have been done better, but hey it works and I didn't know how to fix the spacing between slots without setting individual coords/box. This looks interesting but not every single inventory slot has blue and red boxes around it..
I didn't need to fix anything except for the MI constants in globals.simba, and updating the Slot1 and Slot6 coords in inventory.simba.
Also if I understand correctly, what his does is uses the location of the blue and red boxes to get the bounds, which should work fine as long as they're in opposite corners :)