SRL Archive - Archive

Scripter's Cup for Cigue?


EvilChicken!

2010-07-17 16:05:17

I don't see the point of making these threads exessively long when the script anyway speaks for you.

http://villavu.com/forum/showthread.php?p=723585
He otherwise seems nice, polite and really willing to contribute.

For lazy people, here's his script pasted:
{$Define SMART}
{$i SRL/SRL.scar}
{$i SRL/SRL/misc/Debug.scar}
{$i SRL/SRL/misc/Reports.scar}

//58 agility and Ghosts Ahoy! required to run script.
//Start anywhere with 9 buckets, 9 pots and an ectophial in your inventory.
//Bones have to be visible on first bank page.

//Mad props to i luffs yews (testing), Wizzup? (I'm a fan) and pretty much everyone at SRL.
//Made in memory of HeavenGuard.

type
TTargetObject = record
Uptext, Name : string;
Color, Tolerance, Modx, Mody, Size, Action : integer;
Hue, Sat : extended;
end;

TMMObject = record
Color, Tolerance, Modx, Mody, Size : integer;
Hue, Sat : extended;
Direction, Name : string;
end;

var
x, y, T, H, i : Integer;
ClickPoint : TPoint;
Hopper, Stairs1, Stairs2, Barrier, Banker, WeatheredWall, Ectofuntus : TTargetObject;
Ladder, Hole, Grinder, Road : TMMObject;
LastError : string;

procedure Main_FullRun; forward;

procedure Setup_DeclarePlayers;
begin
HowManyPlayers := 1;
NumberOfPlayers(HowManyPlayers);
CurrentPlayer := 0; //Don't touch
With Players[0] do
begin
Name := '';
Pass := '';
Nick := '';//3-4 lowercase letters from your nickname
Pin := '';
Active:= True;
Strings[0] := 'big'; //Type of bones used. valid parameters are 'big' and 'dragon'.
BoxRewards := ['xp', 'lamp', 'imy', 'oins', 'apphire', 'ssence'];
end;
end;

procedure Setup_DeclareObjects;
begin
with Barrier do
begin
Name := 'Barrier';
Uptext := 'arr';
Color := 7184490;
Tolerance := 19;
Modx := 0;
Mody := 40;
Size := 9;
Hue := 0.29;
Sat := 0.50;
Action := 2;
end;
with Hopper do
begin
Name := 'Hopper';
Modx := 100;
Mody := -50;
Hue := 0.10;
Sat := 0.58;
Color := 3690039;
Tolerance := 8;
Size := 25;
Action := 1;
Uptext := 'opp';
end;
with Banker do
begin
Name := 'Banker';
Uptext := 'ank';
Color := 8635287;
Tolerance := 25;
Modx := 0;
Mody := 100;
Size := 10;
Hue := 0.08;
Sat := 0.76;
Action := 2;
end;
with Stairs1 do
begin
Name := 'Stairs1';
Action := 1;
Color := 1651237;
Hue := 0.17;
Sat := 2.82;
Tolerance := 4;
Uptext := 'air';
Size := 60;
Modx := 50;
Mody := 0;
end;
with Ladder do
begin
Name := 'Ladder';
Color := 602459;
Direction := 'E';
Tolerance := 10;
Size := 3;
Modx := 22;
Mody := 3;
end;
with Grinder do
begin
Name := 'Grinder';
Direction := 'W';
Modx := -27;
Mody := -5;
Hue := 8.80;
Sat := 2.18;
Color := 3752510;
Tolerance := 2;
Size := 6;
end;
with Hole do
begin
Name := 'Hole';
Color := 394754;
Tolerance := 2;
Hue := 45.84;
Sat := 50.01;
Direction := 'W';
Modx := -27;
Mody := 12;
Size := 3;
end;
with WeatheredWall do
begin
Name := 'Weathered Wall';
Modx := 75;
Mody := 0;
Hue := 0.06;
Sat := 0.50;
Color := 2638398;
Tolerance := 10;
Uptext := 'eath';
Size := 10;
Action := 1;
end;
with Stairs2 do
begin
Name := 'Stairs2';
Uptext := 'air';
Hue := 0.20;
Sat := 0.60;
Modx := 0;
Mody := 75;
Color := 2702899;
Tolerance := 3;
Size := 50;
Action := 1;
end;
with Ectofuntus do
begin
Name := 'Ectofuntus';
Uptext := 'tofu';
Modx := 0;
Mody := 80;
Color := 10088101;
Tolerance := 6;
Hue := 0.19;
Sat := 3.80;
Size := 15;
Action := 3;
end;
with Road do
begin
Name := 'Road';
Size := 7;
Hue := 2.57;
Sat := 1.24;
Color := 6122081;
Tolerance := 3;
end;
end;

procedure Misc_Error(Info : String);
begin
MarkTime(H);
if not LoggedIn then Exit;
Writeln('Error : ' + Info);
if ((Info = LastError) and (TimeFromMark(H) < 35000)) then
begin
if not LoggedIn then Exit;
if BankScreen then CloseBank;
Wait(2000 + Random(1000));
TerminateScript;
end else
begin
LastError := Info;
Wait(2000 + Random(1000));
Main_FullRun;
end;
end;

procedure Misc_Proggy;
var
VarNames : TStringArray;
VarValues : TVariantArray;
begin
SetArrayLength(VarNames, (5*HowManyPlayers));
SetArrayLength(VarValues, (5*HowManyPlayers));
for i := 0 to HowManyPlayers do
begin
VarNames[(5*i)] := 'Nickname';
VarNames[(5*i+1)] := 'Runs done';
VarNames[(5*i+2)] := 'XP gained';
VarNames[(5*i+3)] := 'Time Running';
VarNames[(5*i+4)] := 'XP/Hour';
case Players[i].Strings[0] of
'big' : Players[i].Integers[1] := Players[i].Integers[1]*60;
'dragon' : Players[i].Integers[1] := Players[i].Integers[1]*288;
end;
VarValues[(5*i)] := [Players[i].Nick];
VarValues[(5*i+1)] := [Players[i].Integers[0]];
VarValues[(5*i+2)] := [Players[i].Integers[1]];
VarValues[(5*i+3)] := [MsToTime(GetTimeRunning, Time_Abbrev)];
VarValues[(5*i+4)] := [Players[i].Integers[1]/(GetTimeRunning/3600000)];
end;
SRLProgressReport(0, 'Ectofuntus', 'Cigue', '1.4', VarNames, VarValues);
end;

function Math_PointCoords (point1: TPoint; xp, yp : integer): TPoint;//This returns the point xp, yp from point1 if compass was looking north. Use main screen center and minimap center as point1.
var
Angle, Sina, Cosa : Extended;
begin
Angle := rs_GetCompassAngleRadians;
Sina := sin(Angle);
Cosa := cos(Angle);
Result := Point(Round(point1.x + xp * Cosa + yp * Sina), Round(point1.y - xp * Sina + yp * Cosa));
end;

function Math_MMCornerSearch(Direction : string) : TBox;
var
Rotation : Integer;

begin
Result := IntToBox(MMX1, MMY1, MMX2, MMY2);
Writeln('Entering Math_MMCornerSearch');
Rotation := 0;
case RS_GetCompassAngleDegrees of
-1 : Exit;
46..145 : Rotation := 1;
146..225 : Rotation := 2;
226..315 : Rotation := 3;
end;
case lowercase(Direction) of
'west', 'w' : Inc(Rotation);
'south', 's' : IncEx(Rotation, 2);
'east', 'e' : IncEx(Rotation, 3);
end;
case Rotation of
0, 4 : Result := IntToBox(MMX1, MMY1, MMX2, MMCY);
1, 5 : Result := IntToBox(MMX1, MMY1, MMCX, MMY2);
2, 6 : Result := IntToBox(MMX1, MMCY, MMX2, MMY2);
3 : Result := IntToBox(MMCX, MMY1, MMX2, MMY2);
end;
Writeln('Searchbox coords are x1 = ' + IntToStr(Result.x1) + ', y1 = ' + IntToStr(Result.y1) + ', x2 = ' + IntToStr(Result.x2) + ', y2 = ' + IntToStr(Result.y2));
end;

procedure Misc_CTSTreatment(Hue, Sat : Extended);
begin
if (Hue <> 0) or (Sat <> 0) then
begin
ColorToleranceSpeed(2);
SetColorSpeed2Modifiers(Hue, Sat);
end else
begin
ColorToleranceSpeed(1);
SetColorSpeed2Modifiers(0.2, 0.2);
end;
end;

function Misc_FindObject(TargetObject : TTargetObject) : Boolean;
var
StartCoords : TPoint;
ColorPoints : TPointArray;
ColorBoxes : T2DPointArray;
MinFound : Integer;

begin
Writeln('Entering Misc_FindObject with object ' + TargetObject.Name);
if not LoggedIn then Exit;
if (TargetObject.Action > 3) or (TargetObject.Action < 1) then
begin
Writeln('Action parameter should be 1 for left click, 2 for right click, 3 for no click !');
Exit;
end;
StartCoords := Math_PointCoords (point(MSCX, MSCY), TargetObject.modx, TargetObject.mody);
Misc_CTSTreatment(TargetObject.Hue, TargetObject.Sat);
if (TargetObject = Stairs2) then
FindColorsSpiralTolerance(StartCoords.x, StartCoords.y, ColorPoints, TargetObject.Color, MSX1, MSCY, MSX2, MSY2, TargetObject.tolerance)
else
FindColorsSpiralTolerance(StartCoords.x, StartCoords.y, ColorPoints, TargetObject.Color, MSX1, MSY1, MSX2, MSY2, TargetObject.tolerance);
MinFound := (TargetObject.Size)*(TargetObject.Size)/2;
if High(ColorPoints) < (MinFound) then
begin
Writeln('Not enough color found');
Result := False;
Exit;
end;
ColorBoxes := TPAtoATPAEx(ColorPoints, TargetObject.Size, TargetObject.Size);
for i := 0 to Min(8, High(ColorBoxes)) do
begin
StartCoords := MiddleTPA(ColorBoxes[i]);
MMouse(StartCoords.x, StartCoords.y, (TargetObject.Size/4), (TargetObject.Size/4));
Wait(300+Random(150));
if IsUpText(TargetObject.UpText) then
begin
if TargetObject.Action < 3 then
begin
GetMousePos(StartCoords.x, StartCoords.y);
if TargetObject.Action = 1 then
Mouse(StartCoords.x, StartCoords.y, 0, 0, True)
else
Mouse(StartCoords.x, StartCoords.y, 0, 0, False);
end;
Result := True;
Break;
end;
end;
ColorToleranceSpeed(1);
SetColorSpeed2Modifiers(0.2, 0.2);
end;

function Misc_FindMMObject(TargetObject : TMMObject) : TPoint;
var
StartCoords : TPoint;
ColorPoints : TPointArray;
ColorBoxes : T2DPointArray;
SearchAreaBox : TBox;
MinLength, tmpTol : Integer;

begin
Writeln('Entering Misc_FindMMObject with object ' + TargetObject.Name);
if not LoggedIn then Exit;
SearchAreaBox := Math_MMCornerSearch(TargetObject.Direction);
StartCoords := Math_PointCoords(Point(MMCX, MMCY), TargetObject.Modx, TargetObject.Mody);
Writeln('StartCoords are ' + IntToStr(StartCoords.x) + ', ' + IntToStr(StartCoords.y));
Misc_CTSTreatment(TargetObject.Hue, TargetObject.Sat);
for tmpTol := TargetObject.Tolerance to (2*TargetObject.Tolerance) do
begin
FindColorsSpiralTolerance(StartCoords.x, StartCoords.y, ColorPoints, TargetObject.Color, SearchAreaBox.x1, SearchAreaBox.y1, SearchAreaBox.x2, SearchAreaBox.y2, TargetObject.Tolerance);
MinLength := TargetObject.Size*TargetObject.Size/2;
if Length(ColorPoints) > MinLength then
begin
ColorBoxes := TPAtoATPAEx(ColorPoints, TargetObject.Size, TargetObject.Size);
SortATPAFromFirstPoint(ColorBoxes, StartCoords);
Result := ColorBoxes[0][0];
TargetObject.Tolerance := tmpTol;
ColorToleranceSpeed(1);
SetColorSpeed2Modifiers(0.2, 0.2);
Exit;
end;
Writeln('MM Object ' + TargetObject.Name + ' has not been found, increasing tolerance...');
IncEx(TargetObject.Tolerance, 2);
Continue;
end;
Misc_Error('Couldn''t find MM object ' + TargetObject.Name);
end;

procedure Misc_Antiban;
begin
Writeln('Running Antiban');
if not LoggedIn then Exit;
FindNormalRandoms;
LampSkill := 'prayer';
case random(200) of
1: RandomRClick;
2..5: begin
HoverSkill('prayer', False);
GameTab(Tab_Inv);
end;
6..8: PickUpMouse;
9..12: RandomMovement;
13: BoredHuman;
14..15: ExamineInv;
16..19: LevelUp;
20..25: IdleTime(500+Random(500),500, 0.4); //Leeched from Munk Clayftner
30..35: SleepAndMoveMouse(500+random(1000));
36: Sleep(Random(10000));
37: begin
GameTab(tab_Friends);
Wait(1000 + Random(500));
GameTab(tab_Inv);
end;
38..100: begin
MMouse(Random(MIX2-MIX1)+MIX1, Random(MIY2-MIY1)+MIY1, 0, 0);
Wait(100 + random(500));
MMouse(Random(MSX2-MSX1)+MSX1, Random(MSY2-MSY1)+MSY1, 0, 0);
Wait(250 + random(250));
end;
end;
end;

procedure Misc_Flag(WaitMore : Boolean);//Flag lagged too much so I used this.
begin
Wait(400+Random(200));
while ((FlagDistance >= Random(4)) and FindColor(x, y, FlagColor, MMX1, MMY1, MMX2, MMY2)) do
Wait(100 + Random(50));
if WaitMore then Wait(1400+Random(400));
end;

function Misc_DTMCheck(DTMName, BoxName : String; Rotated : Boolean) : Boolean;//Loads DTM, checks for DTM, frees DTM.
var
DTM : Integer;
Box : TBox;
Exploded : TStringArray;

begin
Writeln('Entering Misc_DTMCheck with DTM ' + DTMName);
if not LoggedIn then Exit;
case lowercase(DTMName) of
'pot' : DTM := DTMFromString('78DA633CC8C4C0A002C440C0C800014DD1960' +
'CFC487CC66D40796554350C0CA87CC69D40BE16013520BB7409A8394' +
'38439E78970CF76205F96087314F0AB0100DB7008A6');
'bones' : case lowercase(Players[CurrentPlayer].Strings[0]) of
'dragon' : DTMFromString('78DA63B4606160486064400633264D641001D' +
'220D1FF40C0A80B54938AAA868181094CC2441935806A92885093' +
'40408D39504D0A0135564035E904D4D801D5E41050E342A43984F' +
'C6E4D84DF9D806AB2F0AB010002E90CE6');
'big' : DTM := DTMFromString('78DA6364646660E862644006DBD6AF631001D' +
'220D1FF40C0F89D89816102AA1A06062630091365FC0AE4F71350' +
'F305C8EF21A0E61790DF49400D17D0CD1309A8616726EC1E36A09' +
'A5E026A9809AB01002E4C0F53');
end;
'bonemeal' : DTM := DTMFromString('78DA635CC4C2C0F081910119F477763070016' +
'990E87F20609C0E54F305550D03031398848982D540C570AA9907' +
'54C34A40CD7222D4AC07AA612442CD4FFC6E06004B230D43');
'banker1' : DTM := DTMFromString('78DA63FCCCC4C0C0C9C8800CFEFC61627003D' +
'220D1FF40C0F80EBF1A10000097BE0A7A');
'guard1' : DTM := DTMFromString('78DA63346661600864644006D199D10CFC401' +
'A24FA1F0818B5816AC250D5FCF9C3C460035503028C164035A104' +
'D49800D5C4A1AA89CD8E81DB0502004BF80D0A');
'guard2' : DTM := DTMFromString('78DA6364616660506464400661717E0C1A401' +
'A26CAC80E542385AAE6CF1F26063764351C40356A04D40860DA95981' +
'58962170014F307B4');
'guard3' : DTM := DTMFromString('78DA6334676160486764000108C9C0909819C' +
'3C00FE5FF070246909A325435C9D9717035607143A09A6C54357F' +
'FE3031B821ABB125AC0600337F0D9C');
'guard4' : DTM := DTMFromString('78DA63D4636160486164000108C9C0909411C' +
'92002E5FF07024675A09A4C54357FFE3031B821F1198D816AB208' +
'A83100AA29C66D170800006A740D6D');
'guard5' : DTM := DTMFromString('78DA63F4666160486564000108C9C0109D1CC' +
'D2002E5FF0702461FA09A0254358999097035607167A09A0C5435' +
'7FFE3031B821ABF127AC060047460DD6');
'bucket' : DTM := DTMFromString('78DA633CCCC4C0B0899101042024038397851' +
'8033F129F7117A61A060626143EE36E207F0701357B80FCFD04D41C0' +
'1F20F1250739A0873CE00F9BB08A8394BD85F0022510CC9');
'phial' : DTM := DTMFromString('78DA63DCC7C8C05005C448C07F42020317900' +
'689FE0702C65D405621AA1A06062630091365DC0164D5105003B2' +
'AB91809AC344987304C82A23A0663F9095825F0D00523B0DE0');
'token' : DTM := DTMFromString('78DA634C65666038C3C8800CD442CD1824813' +
'448F43F10301600D59C4055C3C0C0042661A28CB94035E709A849' +
'06AAB948404D0C11E64410A12618D35F186A42806A0EE3570300D' +
'4FE0E66');
'slime' : DTM := DTMFromString('78DA634C646160E86564000108C9C020B15E8' +
'6811FCAFF0F048C914035B360B230C084A287311EA8661E013519' +
'4035B309A8C904AA9946404D0450CD14FC6A006C890AF0');
'gsamulet' : DTM := DTMFromString('78DA63AC656160C867620001460608D8B4721' +
'6031794FF1F08181B816A6298185001AA1EC65EA09A38026A2602' +
'D5241250D341845D554035C904D480FC5546404D25504D0901350' +
'D84CD0100C7780E92');
end;
if (BoxName = 'inv') then GameTab(Tab_Inv);
case lowercase(BoxName) of
'inv', 'inventory' : Box := IntToBox(MIX1, MIY1, MIX2, MIY2);
'mini' : Box := IntToBox(MMX1, MMY1, MMX2, MMY2);
'main' : Box := IntToBox(MSX1, MSY1, MSX2, MSY2);
'minin', 'miniw', 'minis', 'minie' :
begin
Exploded := srl_Explode(lowercase(BoxName), 'mini')
Box := Math_MMCornerSearch(Exploded[1]);
end;
end;
if Rotated then Result := DTMRotated(DTM, x, y, Box.x1, Box.y1, Box.x2, Box.y2) else Result := FindDTM(DTM, x, y, Box.x1, Box.y1, Box.x2, Box.y2);
FreeDTM(DTM);
If Result then Writeln(DTMName + ' has been found') else Writeln(DTMName + ' has not been found');
end;

function Main_Ectophial : Boolean;//Teleports to Ectofuntus.
begin
Writeln('Entering Main_Ectophial');
if Misc_FindObject(Ectofuntus) then
Exit;
if Misc_DTMCheck('phial', 'inv', False) then
begin
Wait(150+Random(300));
MouseItem(CoordsToItem(x, y), True);
Result := True;
Wait(10500+Random(1000));
end else
Misc_Error('Couldn''t find Ectophial in inventory');
end;

function ToBank_FindGuardDTM : Boolean;//Uses DTMs to find barrier guards.
begin
MakeCompass('N');
Writeln('Entering ToBank_FindGuardDTM');
if not Misc_DTMCheck('Guard1', 'MiniS', True) then
begin
if not Misc_DTMCheck('Guard2', 'MiniS', True) then
begin
if not Misc_DTMCheck('Guard3', 'MiniS', True) then
begin
if not Misc_DTMCheck('Guard4', 'MiniS', True) then
begin
if not Misc_DTMCheck('Guard5', 'MiniS', True) then
Main_Ectophial;
Misc_Error('Couldn''t find GuardPointDTM');
end;
end;
end;
end;
Writeln('Found Guards DTM!');
Mouse(Math_PointCoords(Point(x, y), 0, 3).x, Math_PointCoords(Point(x, y), 0, 3).y, 3, 3, True);
Misc_Flag(True);
Result := True;
Wait(1600+Random(200));
end;

function ToBank_ThroughBarrier : Boolean;
begin
if Misc_FindObject(Barrier) then
begin
if WaitOption('ass', (300+Random(400))) then
begin
Wait(1500+Random(350));
Result := True;
Exit;
end else
Misc_Error('Couldn''t find option to pay toll at barrier');
end else
begin
Barrier.Uptext := 'ua';
Barrier.Action := 1;
if Misc_FindObject(Barrier) then
begin
if not ClickContinue(True, True) then Misc_Error('Couldn''t find chatbox while talking to barrier guard');
Wait(1500+Random(350));
Result := True;
Barrier.Uptext := 'arr';
Barrier.Action := 2;
Exit;
end else
Misc_Error('Couldn''t find the barrier or guards');
end;
end;

function ToBank_RoadWalk(xr, yr : integer; Direction : String) : Boolean;
begin
if not LoggedIn then Exit;
Road.Direction := Direction;
Road.Mody := RandomRange((yr-2), (yr+2));
Road.Modx := RandomRange((xr-2), (xr+2));;
ClickPoint := Misc_FindMMObject(Road);
Mouse(ClickPoint.x, Clickpoint.y, 5, 5, True);
Misc_Flag(True);
Result := True;
end;

function ToBank_FindBankerDTM : Boolean;//Uses DTMs to find banker dots.
begin
Writeln('Entering ToBank_FindBankerDTM');
if not LoggedIn then Exit;
Wait(500+random(200));
if not Misc_DTMCheck('Banker1', 'MiniS', True) then
begin
if not Misc_DTMCheck('Banker2', 'MiniS', True) then
Misc_Error('Couldn''t find BankerPointDTM');
end;
Mouse(Math_PointCoords(Point(x, y), 0, 6).x, Math_PointCoords(Point(x, y), 0, 6).y, 3, 3, True);
Result := True;
Misc_Flag(True);
Wait(400+Random(400));
end;

function Bank_OpenGhostBank : Boolean;
var
GhostNeckySlot, tmpTol : Integer;
BankBox : TBox;

begin
Writeln('Entering Bank_OpenGhostBank');
if not LoggedIn then Exit;
tmpTol := Banker.Tolerance;
MarkTime(T);
repeat
if BankScreen then
begin
Result := True;
ColorToleranceSpeed(1);
SetColorSpeed2Modifiers(0.2, 0.2);
Exit;
end;
if Misc_FindObject(Banker) then
begin
ChooseOptionEx('Bank', 'action');
Wait(2000+Random(500));
if not (FindTextTPA(clBlack, 0, MCX1, MCY1, MCX2, MCY2, 'gestures', NPCChars, Nothing) or BankScreen) then
ToBank_FindBankerDTM;
if not Players[CurrentPlayer].Booleans[0] then
begin
if FindTextTPA(clBlack, 0, MCX1, MCY1, MCX2, MCY2, 'gestures', NPCChars, Nothing) then
begin
ClickContinue(True, True);
Wait(500+Random(100));
if PinScreen then
begin
InPin(Players[CurrentPlayer].Pin);
Wait(250+Random(100));
end;
if not BankScreen then
begin
Banker.Tolerance := tmpTol;
Misc_Error('Couldn''t find BankScreen after opening bank');
end;
SearchBank('ghostspeak');
Wait(150 + Random(100));
if FindColorTolerance(x, y, 2182767, 50, 50, 100, 100, 3) then
begin //the next three lines are leeched from SRL Withdraw procedure by Starblaster100, Town, Wizzup? and Narcle
BankBox := BankIndexToMSBox(1);
MouseBox(BankBox.X1 + 5, BankBox.Y1 + 5, BankBox.X2 - 5, BankBox.Y2 - 5, 1);
Wait(RandomRange(50, 150));
CloseBank;
if (GetCurrentTab <> Tab_Inv) then GameTab(Tab_Inv);
if Misc_DTMCheck('GSAmulet', 'inv', False) then
begin
GhostNeckySlot := CoordsToItem(x, y)
InvMouse(GhostNeckySlot, 1);
MarkTime(T);
end else
begin
Banker.Tolerance := tmpTol;
Misc_Error('Something went wrong while equipping GS.');
end;
Continue;
end else
Misc_Error('You need a Ghostspeak amulet to run this script');
end else
Players[CurrentPlayer].Booleans[0] := True;
end;
if PinScreen then InPin(Players[CurrentPlayer].Pin);
if (GhostNeckySlot <> 0) and ExistsItem(GhostNeckySlot) then InvMouse(GhostNeckySlot, 1);
end;
Inc(Banker.Tolerance);
until BankScreen or (TimeFromMark(T) > 9000);
Banker.Tolerance := tmpTol;
ColorToleranceSpeed(1);
SetColorSpeed2Modifiers(0.2, 0.2);
end;

procedure Bank_Withdraw;//Bones have to be visible on first bank page !
var
BBox : TBox;

begin
Writeln('Entering Bank_Withdraw');
if not LoggedIn then Exit;
if not BankScreen then
begin
Misc_Error('Couldn''t find BankScreen');
end;
Wait(RandomRange(600, 1000));
if Misc_DTMCheck('Token', 'Inv', False) then
Deposit(CoordsToItem(x, y), CoordsToItem(x, y), True);
if Misc_DTMCheck('Bones', 'Main', False) then
begin //The following is leeched from the Withdraw function in SRL
BBox := BankIndexToMSBox(BankPointToBankIndex(MSTPointToBankPoint(Point(x,y))));
MouseBox(BBox.X1 + 5, BBox.Y1 + 5, BBox.X2 - 5, BBox.Y2 - 5, 2);
case Random(25) of
0..23 : WaitOptionMulti(['Withdraw-All', 'draw-All'], 300 + Random(100));
24 : begin
if (WaitOptionMulti(['Withdraw-X', 'draw-X'], 300 + Random(100))) then
begin
Wait(500 + Random(700));
TypeSend(IntToStr(9+Random(10000)));
end;
end;
end;
end else
Misc_Error('Ran out of bones');
CloseBank;
Wait(400+Random(1000));
end;

function ToGrinder_TPALadder : Boolean;
begin
Writeln('Entering ToGrinder_TPALadder');
ClickPoint := Misc_FindMMObject(Ladder);
Inc(ClickPoint.y);
DecEx(ClickPoint.x, 3);
Mouse(ClickPoint.x, ClickPoint.y, 3, 3, True);
Misc_Flag(True);
Result := True;
end;

function ToGrinder_UpStairs : Boolean;
begin
Writeln('Entering ToGrinder_UpStairs');
if not LoggedIn then Exit;
if Misc_FindObject(Stairs1) then Result := True;
Misc_Flag(True);
Wait(600+Random(400));
end;

function ToGrinder_TPAGrinder : Boolean;
begin
Writeln('Entering ToGrinder_TPAGrinder');
if not LoggedIn then Exit;
ClickPoint := Misc_FindMMObject(Grinder);
Inc(ClickPoint.y);
DecEx(ClickPoint.x, 3);
Mouse(Clickpoint.x, Clickpoint.y, 4, 4, True);
Misc_Flag(True);
Result := True;
Wait(400+Random(300));
end;

function Grinder_Operate : Boolean;
begin
Writeln('Entering Grinder_Operate');
if not LoggedIn then Exit;
Misc_FindObject(Hopper);
if FindTextTPA(clBlack, 0, MCX1, MCY1, MCX2, MCY2, 'varus', NPCChars, Nothing) then
begin
ClickContinue(True, True);
Wait(500+Random(100));
MarkTime(T);
while ((TimeFromMark(T) < 5000) and (CountColor(0, MCX1, MCY1, MCX2, MCY2) <> 593)) do
Wait(500+Random(100));
MouseBox(189, 394, 328, 406, 1);
Wait(800+Random(400));
Misc_FindObject(Hopper);
end;
MarkTime(T);
while (TimeFromMark(T) < 120000) do
begin
if InvCount = 19 then
begin
Wait(RandomRange(5500, 6500));
Break;
end;
Wait(1500+Random(1500));
case Random(8) of
0 : Misc_Antiban;
end;
end;
if Misc_DTMCheck('Bonemeal', 'Inv', False) then
Result := True
else
Misc_Error('Couldn''t find bonemeals after operating grinder');
end;

function ToPool_TPAHole : Boolean;
begin
Writeln('Entering ToPool_TPAHole');
ClickPoint := Misc_FindMMObject(Hole);
Mouse(ClickPoint.x, ClickPoint.y, 3, 3, True);
Misc_Flag(True);
Result := True;
end;

function ToPool_TrapDoor : Boolean;
var
TrapdoorPoints : TPointArray;
TrapdoorBoxes : T2DPointArray;

begin
Writeln('Entering ToPool_TrapDoor');
if not LoggedIn then Exit;
MarkTime(T);
While (not Result and (TimeFromMark(T) < 20000)) do
begin
Writeln('Starting loop');
Wait(RandomRange(600, 1000));
begin
if (CountColor(855309, MSX1, MSY1, MSX2, MSY2) < 100) then
SetAngle(True);
if (CountColor(855309, MSX1, MSY1, MSX2, MSY2) > 100) then
begin
FindColorsSpiralTolerance(MSCX, MSCY, TrapdoorPoints, 855309, MSX1, MSY1, MSX2, MSY2, 0);
Writeln('Found open trapdoor color');
end else
begin
Writeln('Didn''t find open trapdoor');
ColorToleranceSpeed(2);
SetColorSpeed2Modifiers(0.76, 0.38);
if (CountColorTolerance(2900524, MSX1, MSY1, MSX2, MSY2, 3) > 100) then
begin
Writeln('Found closed trapdoor');
FindColorsSpiralTolerance(MSCX, MSCY, TrapdoorPoints, 2900524, MSX1, MSY1, MSX2, MSY2, 3);
end else
Writeln('Couldn''t find trapdoor color');
end;
TrapdoorBoxes := TPAtoATPAEx(TrapdoorPoints, 20, 20);
for i:= 0 to High(TrapdoorBoxes) do
begin
ClickPoint := MiddleTPA(TrapdoorBoxes[i]);
MMouse(MiddleTPA(TrapdoorBoxes[i]).x, MiddleTPA(TrapdoorBoxes[i]).y, 10, 10);
Wait(300+Random(300));
if IsUpText('pen') then
begin
Writeln('Found closed trapdoor');
GetMousePos(x,y);
Mouse(x, y, 0, 0, True);
Misc_Flag(True);
FindColorsSpiralTolerance(MSCX, MSCY, TrapdoorPoints, 855309, MSX1, MSY1, MSX2, MSY2, 0);
TrapdoorBoxes := TPAtoATPAEx(TrapdoorPoints, 20, 20);
For i:= 0 to High(TrapdoorBoxes) do
begin
ClickPoint := MiddleTPA(TrapdoorBoxes[i]);
MMouse(MiddleTPA(TrapdoorBoxes[i]).x, MiddleTPA(TrapdoorBoxes[i]).y, 10, 10);
Wait(300+Random(300));
if IsUpText('own') then
begin
Writeln('Opened trapdoor successfully');
GetMousePos(x,y);
Mouse(x, y, 0, 0, True);
Wait(400+Random(200));
ColorToleranceSpeed(1);
SetColorSpeed2Modifiers(0.2, 0.2);
MarkTime(T);
while (CountColor(1514761, MSX1, MSY1, MSX2, MSY2) < 600) and (TimeFromMark(T) < 8000) do
Wait(400+Random(400));
if CountColor(1514761, MSX1, MSY1, MSX2, MSY2) > 600 then
begin
Result := True;
Writeln('Went down trapdoor');
Wait(400+Random(400));
Exit;
end;
end else
Writeln('Didn''t open trapdoor');
end;
end;
if IsUpText('own') then
begin
Writeln('Found open trapdoor');
GetMousePos(x,y);
Mouse(x, y, 0, 0, True);
Wait(400+Random(200));
ColorToleranceSpeed(1);
SetColorSpeed2Modifiers(0.2, 0.2);
MarkTime(T);
while (CountColor(1514761, MSX1, MSY1, MSX2, MSY2) < 600) and (TimeFromMark(T) < 8000) do
Wait(400+Random(400));
if CountColor(1514761, MSX1, MSY1, MSX2, MSY2) > 600 then
begin
Result := True;
Writeln('Went down trapdoor');
Wait(400+Random(400));
Exit;
end;
end;
end;
end;
end;
if (not Result) then Misc_Error('Trapdoor not found, exiting');
end;

function ToPool_WeatheredWall : Boolean;
var
Downstairs : Boolean;

begin
Writeln('Entering ToPool_WeatheredWall');
Misc_FindObject(WeatheredWall);
MarkTime(T);
while (CountColorTolerance(2638398, (MSX1+(MSX1+MSCX)/2), (MSY1+(MSY1+MSCY)/2), (MSX1+(MSX2+MSCX)/2), (MSY1+(MSY2+MSCY)/2), 10) > 250) and (TimeFromMark(T) < 10000) do
Wait(600+Random(400));
SetColorSpeed2Modifiers(0.13, 1.23);
if not IsUpText('airs') then
begin
MMouse(Math_PointCoords(Point(MSCX, MSCY), 50, 0).x, Math_PointCoords(Point(MSCX, MSCY), 50, 0).y, 10, 10);
Wait(200+Random(300));
end;
MarkTime(T);
repeat
if IsUpText('airs') then
begin
GetMousePos(x, y);
Mouse(x, y, 0, 0, True);
Downstairs := True;
Break;
end;
Wait(200+Random(300));
until (TimeFromMark(T) > 5000);
if not DownStairs then Misc_Error('Couldn''t find stairs uptext(Weathered Wall)');
MarkTime(T);
while not FindColorTolerance(x, y, 6474319, MSX1, MSY1, MSX2, MSY2, 66) and (TimeFromMark(T) < 10000) do
Wait(200+Random(300));
if FindColorTolerance(x, y, 6474319, MSX1, MSY1, MSX2, MSY2, 33) then Result := True;
ColorToleranceSpeed(1);
SetColorSpeed2Modifiers(0.2, 0.2);
Wait(400+Random(400));
end;

function ToPool_CrossPool : Boolean;
begin
if not LoggedIn then Exit;
Mouse(Math_PointCoords(Point(MMCX, MMCY), 45, 0).x, Math_PointCoords(Point(MMCX, MMCY), 50, 0).y, 8, 8, True);
Misc_Flag(True);
Result := True;
Wait(400+Random(400));
end;

function ToPool_DownStairs : Boolean;
var
StartSearchPoint : TPoint;

begin
Writeln('Entering ToPool_Downstairs');
Misc_CTSTreatment(0, 0);
if not LoggedIn then Exit;
StartSearchPoint := Math_PointCoords(Point(MSCX, MSCY), -70, 0);
MMouse(StartSearchPoint.x, StartSearchPoint.y + 20, 8, 8);
Wait(200+Random(200));
if IsUpText('air') then
begin
GetMousePos(x, y);
Mouse(x, y, 0, 0, true);
if CountColor(12778951, MSX1, MSY1, MSX2, MSY2) > 10000 then
Result := True;
Wait(400+Random(400));
Exit;
end else
begin
MakeCompass('E');
Wait(200+Random(200));
if IsUpText('air') then
begin
GetMousePos(x, y);
Mouse(x, y, 0, 0, true);
if CountColor(12778951, MSX1, MSY1, MSX2, MSY2) > 10000 then
Result := True;
Wait(400+Random(400));
Exit;
end;
SetAngle(False);
if not Misc_FindObject(Stairs2) then
Misc_Error('Stairs2 not found');
end;
Wait(1300 + Random(200));
if CountColorTolerance(12778951, MSX1, MSY1, MSX2, MSY2, 5) > 10000 then
begin
Result := True;
end else
Misc_Error('Couldn''t find slime pool color');
Wait(400+Random(400));
SetAngle(True);
end;

function Pool_FillBucket : Boolean;
var
StartSearchPoint : TPoint;
SlimePoints : TPointArray;
SlimeBoxes : T2DPointArray;

begin
Writeln('Entering Pool_FillBucket');
if not LoggedIn then Exit;
if not Misc_DTMCheck('Bucket', 'Inv', False) then Misc_Error('Bucket not found in inventory');
MouseItem(CoordsToItem(x, y), True);
Wait(200+Random(400));
StartSearchPoint := Math_PointCoords(Point(MSCX, MSCY), -50, 0);
FindColorsSpiralTolerance(StartSearchPoint.x, StartSearchPoint.y, SlimePoints, 12778951, (MSX1+2*MSCX/3), (MSY1+2*MSCY/3), (MSX1+2*MSX2/3), (MSY1+2*MSY2/3), 4);
if Length(SlimePoints) > 1000 then
begin
SlimeBoxes := TPAtoATPAEx(SlimePoints, 25, 25);
SortATPAFromFirstPoint(SlimeBoxes, StartSearchPoint);
MMouse(SlimeBoxes[0][0].x, SlimeBoxes[0][0].y, 10, 10);
Wait(300+Random(300));
if IsUpText('ool') then
begin
GetMousePos(x, y);
Mouse(x, y, 0, 0, true);
MarkTime(T);
while (CountColor(1945625, MIX1, MIY1, MIX2, MIY2) <> 450) and (TimeFromMark(T) < RandomRange(21000, 22000)) do
Wait(300+Random(300));
if Misc_DTMCheck('Slime', 'inv', false) then
Result := True
else
Misc_Error('No slime found in inventory');
end else
Misc_Error('Couldn''t find pool uptext');
end else
Misc_Error('Couldn''t find pool color');
end;

procedure Raw_Grinder;
var C : integer;
begin
if not LoggedIn or not Misc_DTMCheck('Bones', 'inv', False) then Exit;
Writeln('Entering Raw_Grinder');
For C := 0 to 4 do
begin
Case C of
0 : ToGrinder_TPALadder;
1 : ToGrinder_Upstairs;
2 : ToGrinder_TPAGrinder;
3 : Grinder_Operate;
4 : Main_Ectophial;
end;
Misc_Antiban;
end;
end;

procedure Raw_Pool;
var C : integer;
begin
Writeln('Entering Raw_Pool');
For C := 0 to 6 do
begin
Case C of
0 : ToPool_TPAHole;
1 : ToPool_TrapDoor;
2 : ToPool_WeatheredWall;
3 : ToPool_CrossPool;
4 : ToPool_DownStairs;
5 : Pool_FillBucket;
6 : begin
if Misc_DTMCheck('phial', 'inv', False) then
begin
Wait(150+Random(300));
MouseItem(CoordsToItem(x, y), True);
Wait(10500+Random(1000));
end else
Misc_Error('Couldn''t find Ectophial in inventory'); ;
end;
end;
Misc_Antiban;
end;
end;

procedure Main_Worship;
var
j : integer;
DisciplePoints : TPointArray;
DiscipleBoxes : T2DPointArray;

begin
Writeln('Entering Main_Worship');
if not LoggedIn then Exit;
Misc_FindObject(Ectofuntus);
for i:= 0 to 12 do
begin
if Misc_DTMCheck('Bonemeal', 'inv', False) and Misc_DTMCheck('Slime', 'inv', False) then
begin
Wait(200+Random(500));
GetMousePos(x, y);
Mouse(x, y, 0, 0, True);
end;
end;
inc(Players[CurrentPlayer].Integers[0]);
if (Misc_DTMCheck('slime', 'inv', False) or Misc_DTMCheck('bonemeal', 'inv', False)) then
Misc_Error('Materials remaining after worship');
Wait(1000+Random(500));
Misc_Antiban;
Mouse(Math_PointCoords(Point(MMCX, MMCY), 0, RandomRange(18, 22)).x, Math_PointCoords(Point(MMCX, MMCY), 0, RandomRange(18, 22)).y, 5, 5, True);
Misc_Flag(True);
ColorToleranceSpeed(2);
SetColorSpeed2Modifiers(0.02, 0.93);
MarkTime(T);
repeat
FindColorsSpiralTolerance(x, y, DisciplePoints, 9944994, MSX1, MSY1, MSX2, MSY2, 18)
DiscipleBoxes := TPAtoATPAEx(DisciplePoints, 30, 30);
if Length(DisciplePoints) < 25 then
begin
x := MMCX;
y := MMCY;
FindColorSpiralTolerance(x, y, 195836, MMX1, MMY1, MMX2, MMY2, 0);
Mouse(x, y, 5, 5, True);
Misc_Flag(True);
FindColorsSpiralTolerance(x, y, DisciplePoints, 9944994, MSX1, MSY1, MSX2, MSY2, 18);
DiscipleBoxes := TPAtoATPAEx(DisciplePoints, 30, 30);
end;
while j < 3 do
begin
for i := 0 to High(DiscipleBoxes) do
begin
MMouse(MiddleTPA(DiscipleBoxes[i]).x, MiddleTPA(DiscipleBoxes[i]).y, 10, 10);
Wait(300+Random(400));
if IsUpText('disc') then
begin
GetMousePos(x, y);
Mouse(x, y, 0, 0, False);
WaitOption('Coll', (200+Random(100)));
Wait(600+Random(400));
ClickContinue(True, True);
Wait(1000+Random(500));
if Misc_DTMCheck('token', 'inv', False) then
DropItem(CoordsToItem(x, y));
Wait(800+Random(400));
Exit;
end;
end;
inc(j);
FindColorsSpiralTolerance(x, y, DisciplePoints, 9944994, MSX1, MSY1, MSX2, MSY2, 18)
DiscipleBoxes := TPAtoATPAEx(DisciplePoints, 30, 30);
Wait(1000+Random(2000));
end;
until (TimeFromMark(T) > 30000);
Writeln('Better luck next time');
end;

procedure Main_Bank;
var
C : integer;

begin
Writeln('Entering Main_Bank');
if not LoggedIn then Exit;
for C := 0 to 8 do
begin
case C of
0 : ToBank_FindGuardDTM;
1 : ToBank_ThroughBarrier;
2, 3 : begin
if not ToBank_RoadWalk(15, 65, 'S') then
begin
MakeCompass('N');
if not ToBank_RoadWalk(15, 65, 'S') then
Misc_Error('Got lost walking to bank');
end;
end;
4 : begin
if not ToBank_RoadWalk(65, 10, 'E') then
begin
MakeCompass('N');
if not ToBank_RoadWalk(65, 10, 'E') then
Misc_Error('Got lost walking to bank');
end;
end;
5 : ToBank_FindBankerDTM;
6 : Bank_OpenGhostBank;
7 : Bank_Withdraw;
8 : Main_Ectophial;
end;
Misc_Antiban;
end;
end;

procedure Main_CollectRawMaterials;
begin
Writeln('Entering Main_CollectRawMaterials');
Case RBool of
True :
begin
if not Misc_DTMCheck('Slime', 'inv', false) then Raw_Pool;
if not Misc_DTMCheck('Bonemeal', 'inv', False) then
Raw_Grinder;
end;
False :
begin
if not Misc_DTMCheck('Bonemeal', 'inv', False) then
Raw_Grinder;
if not Misc_DTMCheck('Slime', 'inv', false) then
Raw_Pool;
end;
end;
end;

procedure Setup_Locate;
begin
if not LoggedIn then Exit;
Writeln('Entering Setup_Locate');
if (Misc_DTMCheck('Bones', 'inv', False) or Misc_DTMCheck('Bonemeal', 'inv', False)) then
begin
Main_Ectophial;
Exit;
end;
if Misc_DTMCheck('token', 'inv', False) then
DropItem(CoordsToItem(x, y));
SymbolAccuracy := 0.65;
Banker.Action := 3;
if Misc_FindObject(Banker) then
begin
Banker.Action := 2;
Bank_OpenGhostBank;
Bank_Withdraw;
end else
begin
if FindSymbol(x, y, 'bank') then
begin
Mouse(x, y, 5, 5, True);
Misc_Flag(True);
ToBank_FindBankerDTM;
Bank_OpenGhostBank;
Bank_Withdraw;
end else
begin
Main_Bank;
end;
end;
Banker.Action := 2;
Main_Ectophial;
end;

procedure Main_FullRun;
var A, B, C : integer;

begin
Writeln('Entering Main_FullRun');
if not LoggedIn then LoginPlayer;
RandomAngle(True);
MarkTime(A);
MarkTime(B);
repeat
for C := 0 to 5 do
begin
case C of
0 : Setup_Locate;
1 : Main_CollectRawMaterials;
2 : Main_Worship;
3 : Main_Bank;
end;
Misc_Antiban;
Misc_Proggy;
if TimeFromMark(B) > 600000 then
begin
Writeln('A run has taken over 10 minutes, terminating script');
LogOut;
TerminateScript;
end;
if TimeFromMark(A) > 3600000 then
begin
Writeln('Taking break');
LogOut;
Sleep(RandomRange(240000,480000));
LogInPlayer;
MarkTime(A);
end;
end;
MarkTime(B);
until (False)
end;

begin
SMART_Members := True;
Writeln('Starting script');
SetupSRL;
Setup_DeclarePlayers;
Setup_DeclareObjects;
if not LoggedIn then
begin
repeat
Wait(200+random(500));
Writeln('Initializing...');
until RSReady;
LoginPlayer;
end;
repeat Main_FullRun until Players[0].Active = False;
end.

Coh3n

2010-07-17 17:36:06

Yes. :)

EvilChicken!

2010-07-17 18:13:49

Not sure if this deserves a new post, bu whatthehell.
Anyway, I just told him that INI files are neat for permanent data storage.
Without any further knowledge than me telling him to use the commands "ReadINI();" and "WriteINI();", he made this in under an hour.

{$i SRL/SRL.scar}

procedure MarkTimeINI(Mark, INIFileName : string);
begin
WriteINI('Time Marks', 'Mark', TheTime + ' ' + TheDate(3), ScriptPath + 'TestFile.ini');
end;

function TimeFromMarkINI(Mark, INIFileName : string) : integer;
var
LH, LDBM, CH, CDBM, i : integer;
DaysInMonthLY, DaysInMonthCY : TIntegerArray;
LR, CR : String;
LRA, CRA : TStringArray;
LRAA, CRAA : array [0..1] of TStringArray;

begin
LR := ReadINI('Time Marks', Mark, IniFileName);
CR := TheTime + ' ' + TheDate(3);

SetArrayLength(LRA, 3);
SetArrayLength(CRA, 3);
SetArrayLength(LRAA[0], 3);
SetArrayLength(LRAA[1], 3);
SetArrayLength(CRAA[0], 3);
SetArrayLength(CRAA[1], 3);

LRA := srl_Explode(LR, ' ');
LRAA[0] := srl_Explode(LRA[0], ':');
LRAA[1] := srl_Explode(LRA[2], '-');
CRA := srl_Explode(CR, ' ');
CRAA[0] := srl_Explode(CRA[0], ':');
CRAA[1] := srl_Explode(CRA[2], '-');

CH := StrToInt(CRAA[0][0]);
if (CRA[1] = 'PM') then IncEx(CH, 12);

LH := StrToInt(LRAA[0][0]);
if (LRA[1] = 'PM') then IncEx(LH, 12);

SetArrayLength(DaysInMonthLY, 12);
DaysInMonthLY := [31, 29, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30];
if ((StrToInt(LRAA[1][0]) mod 4) = 0) then
Inc(DaysInMonthLY[1]);
for i := 0 to (StrToInt(LRAA[1][1]) - 1) do
IncEx(LDBM, DaysInMonthLY[i]);
SetArrayLength(DaysInMonthCY, 12);
DaysInMonthCY := [31, 29, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30];
if (StrToInt(CRAA[1][0]) mod 4 = 0) then
Inc(DaysInMonthCY[1]);
for i := 0 to (StrToInt(CRAA[1][1]) - 1) do
IncEx(CDBM, DaysInMonthCY[i]);

Result := (StrToInt(CRAA[0][2]) - StrToInt(LRAA[0][2])) + 60*(StrToInt(CRAA[0][1]) -
StrToInt(LRAA[0][1])) + 3600*(CH - LH) + 86400*(StrToInt(CRAA[1][2]) -
StrToInt(LRAA[1][2]) + CDBM - LDBM) + 31536000*(StrToInt(CRAA[1][0]) -
StrToInt(LRAA[1][0]));
end;

begin
MarkTimeINI('Mark', ScriptPath + 'TestFile.ini');
Wait(RandomRange(5000, 10000));
Writeln(IntToStr(TimeFromMarkINI('Mark', ScriptPath + 'TestFile.ini')) + ' seconds elapsed since last mark');
end.

I guess one could also add "fast learner" to his qualities?

Sir R. M8gic1an

2010-07-17 22:18:54

Good Call! Glad to see you back EC!

I'm a yes on it, just waiting for a couple more posts. :)

~RM

Nava2

2010-07-18 03:33:57

I think he deserves kitty! Good call EC!

Naum

2010-07-18 05:22:00

LOL @ your avvy EC!
Script looks worthy

NCDS

2010-07-18 12:22:14

Look's good enough to me! Yes.

lordsaturn

2010-07-18 18:59:30

Very Yes :3

marpis

2010-07-19 05:38:47

Ofcourse

EvilChicken!

2010-07-19 06:57:02

It's been granted. :)
Pseudo-closed, unless someone has something more to say.

EDIT: Would be nice if someone could add a [fixed]-tag or something to this thread and finally close it.
EDIT2: Lol, I only now noticed that this subforum doesn't have tags. Closed, then.