Naike
2008-12-23 19:31:11
Moved to JR.Members!
Enjoy it.
Note: This is my yearly script to Jr.membs :rolleyes:!
Overusing this will result in me removing it.
Hope you like it.
Ogre Ranger! Version 2.0
By N1ke!
Don't got reflections? Go here
You need by responder for this to work,
Download the puplic version here then
overwrite the CAutoResponder with the one
i included in this post.
What it does
- Kill Ogres
- Responds to simple questions
- Logs if you got -100 arrows/darts/knives
- SMART Paint CharReport&Scar ProgressReport
- ToolBox!
ToolBox!
ToolBox! is a Runtime form which can be opened
pushing F10(Defualt key). From that window you can
select things the script will do. For this script
i've got the following
This form can be up and running at the same time as the script kills ogres without lag or freezing.
After you click on something it will take 0-5 secs for
the script to do what it's told.
Don't forget to Enable Debug on S.M.A.R.T otherwise painting will not work.
Replace GameTab.scar with the reflection one, as it fixes the Interface problems.
For best result download the Worldswitcher.scar and replace it with SRL's current one.
This is the final release, it will not be uptaded anymore!.
I take no responsibility for banned/killed chars!
program New;
{.include SRL/SRL/Misc/SMART.scar}
{.include SRL/SRL.scar}
{.include srl/srl/misc/worldswitcher.scar}
{.include SRL/SRL/Reflection/Reflection.scar}
{.include SRL/SRL/Misc/FindXP.Scar}
Type
Progress = Record
StartExp, StartLevels, ExpGain, LevelsGain : Array [1..2] of Integer;
WeaponSpot : Integer;
Weapon : TInvItem;
Time : Integer;
end;
var
ProgressPlayer : array of Progress;
TotalExp, TotalLevels, TotalAttacks,OgreIndex, Counter, Action: integer;
TypeThis: String;
frmDesign : TForm;
Button : array [0..5] of TButton;
TS : TEdit;
const
DebugMode = False;
ChangeWorldIfCannon = True;
FKeyForOptions = 10;
XCordForSMARTProggie = 6;
YCordForSMARTProggie = 25;
procedure DeclarePlayers;
begin
HowManyPlayers:= 1;
NumberOfPlayers(HowManyPlayers);
CurrentPlayer := 0;
Players[0].Name := '';
Players[0].Pass := '';
Players[0].Nick := '';
Players[0].Active := True;
Players[0].Booleans[0] := False; // Logout about every 10 minutes.
Players[0].Booleans[1] := True; // Sleep once in a while.. /Needs Booleans[0] true.
Players[0].Booleans[2] := True; // Take long sleeps. Good for 24/hour runs. /Needs Booleans[0] true.
Players[0].Booleans[3] := True; // Special attack?
Players[0].Booleans[4] := False; // Right Click only?
Writeln( IntToStr ( HowManyPlayers ) + ' Players' );
SetPlayerNameTPAs;
SetArrayLength(ProgressPlayer, HowManyPlayers);
end;
Procedure DebugThis(S :String);
begin
If DebugMode Then
Writeln(s + ' | LoggedIn : ' + BoolToStr(LoggedIn));
end;
Procedure WantOptions;Forward;
Procedure DoButton1(Sender : TObject);
begin
TypeThis := TS.Text;
TS.Text := '';
Action := 1;
end;
Procedure DoButton2(Sender : TObject);
begin
Action := 2;
end;
Procedure DoButton3(Sender : TObject);
begin
Action := 3;
end;
Procedure DoButton4(Sender : TObject);
begin
Action := 4;
end;
Procedure DoButton5(Sender : TObject);
begin
Action := 5;
end;
Procedure DoButton6(Sender : TObject);
begin
Action := 6;
end;
procedure InitForm;
var
i: integer;
begin
frmDesign := CreateForm;
frmDesign.Left := 200;
frmDesign.Top := 345;
frmDesign.Width := 200;
frmDesign.Height := 345;
frmDesign.Caption := 'ToolBox!';
frmDesign.Color := clBlack;
frmDesign.Font.Color := clWindowText;
frmDesign.Font.Height := -11;
frmDesign.Font.Name := 'MS Sans Serif';
frmDesign.Font.Style := [];
frmDesign.Visible := True;
frmDesign.PixelsPerInch := 96;
frmDesign.BorderStyle := BsSingle;
TS := TEdit.Create(frmDesign);
TS.Parent := frmDesign;
TS.Left := 100;
TS.Top := 23;
TS.Width := 70;
TS.Height := 20;
For i:=1 to 5 do
begin
Button[i] := TButton.Create(frmDesign);
Button[i].Parent := frmDesign;
Button[i].Left := 30;
Button[i].Top := 16 + I * 48;
Button[i].Width := 140;
Button[i].Height := 33;
Button[i].TabOrder := I;
end;
Button[0] := TButton.Create(frmDesign);
Button[0].Parent := frmDesign;
Button[0].Left := 30;
Button[0].Top := 16;
Button[0].Width := 65;
Button[0].Height := 33;
Button[0].OnClick := @DoButton1;
Button[0].Caption := 'Type this';
Button[1].OnClick := @DoButton2;
Button[1].Caption := 'Special attack';
Button[2].OnClick := @DoButton3;
Button[2].Caption := 'NextPlayer(True)';
Button[3].OnClick := @DoButton4;
Button[3].Caption := 'NextPlayer(False)';
Button[4].OnClick := @DoButton5;
Button[4].Caption := 'Uptade ProgressReport';
Button[5].OnClick := @DoButton6;
Button[5].Caption := 'Change world';
end;
procedure SafeInitForm;
var
v: TVariantArray;
begin
setarraylength(V, 0);
ThreadSafeCall('InitForm', v);
end;
procedure ShowFormModal;
begin
frmDesign.Show;
end;
procedure SafeShowFormModal;
var
v: TVariantArray;
begin
setarraylength(V, 0);
ThreadSafeCall('ShowFormModal', v);
end;
Procedure OpenForm;
begin
SafeInitForm;
SafeShowFormModal;
end;
Procedure GetWeapon;
var
Equiped : TItemArray;
begin
DebugThis('GetWeapon Started.');
Equiped := GetEquippedItems;
If Equiped[3].Stack > 100 then
Begin
ProgressPlayer[CurrentPlayer].WeaponSpot := 3;
ProgressPlayer[CurrentPlayer].Weapon.ID := Equiped[3].ID;
ProgressPlayer[CurrentPlayer].Weapon.Stack := Equiped[3].Stack;
Exit;
end;
If Equiped[13].Stack > 100 then
begin
ProgressPlayer[CurrentPlayer].WeaponSpot := 13;
ProgressPlayer[CurrentPlayer].Weapon.ID := Equiped[13].ID;
ProgressPlayer[CurrentPlayer].Weapon.Stack := Equiped[13].Stack;
Exit;
end;
end;
Function HowMuchAmmo: Integer;
begin
DebugThis('HowMuchAmmo Started.');
Result := GetEquippedItemAmountAt(ProgressPlayer[CurrentPlayer].WeaponSpot);
Writeln('Ammo left : ' + IntToStr(Result));
DebugThis('HowMuchAmmo ended : ' + IntToStr(Result));
end;
Procedure CheckAmmo;
begin
DebugThis('CheckAmmo Started.');
If HowMuchAmmo < 100 then
begin
WriteLn(Players[CurrentPlayer].Name + ' Logged. Cause: Low ammo.');
LogOut;
Exit;
end;
end;
Function ChangeWorld(WorldNumber: Integer; Members, Pvp: Boolean): Boolean;
begin
If LoggedIn Then Logout;
Wait(1000+Random(2000));
If WorldNumber > 0 then
begin
Result := SelectWorld(WorldNumber);
Exit;
end;
Result := SelectWorld(RandomWorld(Members, Pvp));
end;
Function FindCannon: Boolean;
var TempT : TPoint;
begin
If ChangeWorldIfCannon then
Result := FindObjectEx(TempT, 6, 25);
end;
Function DealWithCannon:Boolean;
begin
If FindCannon Then
begin
DebugThis('Found Cannon, Changing world.');
LogOut;
ChangeWorld(0, True, False);
Wait(RandomRange(1500, 10000));
LoginPlayer;
Result := True;
end;
end;
{*******************************************************************************
Function CountSpecial: Integer;
By: N1ke!
Description: Counts special attack power, results in 25, 50, 75 or 100.
*******************************************************************************}
Function CountSpecial: Integer;
var
Spec : array [1..2] of TPoint;
i, x, y : Integer;
begin
If Not GameTab(1)Then Exit;
Spec[1] := Point(602, 417);
Spec[2] := Point(619, 426);
Wait(250+Random(500));
For i:=1 to 4 do
begin
If FindColorTolerance(x, y, 4294720, Spec[1].X, Spec[1].Y, Spec[2].X, Spec[2].Y, 10)then
begin
Result := Result + 25;
Spec[1] := Point(Spec[1].X + 28, Spec[1].Y);
Spec[2] := Point(Spec[2].X + 28, Spec[2].Y);
end else Exit;
end;
end;
{*******************************************************************************
Function UseSpecial(PowerNeed: Integer):Boolean;
By: N1ke!
Description: Uses special. Powerneed = How much power you need to
perform a special attack ( 25/50/75/100% ).
*******************************************************************************}
Function DoSpec(PowerNeed: Integer):Boolean;
begin
DebugThis('DoSpec Started.');
If Not Players[CurrentPlayer].Booleans[3] then Exit;
If CountSpecial >= PowerNeed then
begin
MouseBox(574, 417, 710, 426, 1);
Result := True;
end;
end;
{*******************************************************************************
Function ChangeWorld: Boolean;
by: N1ke!
Description: Changes world.
Leave WorldNumber to 0 for random world. If so choose Members/Pvp booleans.
*******************************************************************************}
Function CountPeople: Integer;
var
CDS : Array of Tplayer;
begin
DebugThis('CountPeople Started.');
CDS := GetPlayers;
Result := Length(CDS);
DebugThis('CountPeople Ended : ' + IntToStr(Result));
end;
Function Crowded: Boolean;
Begin
Result := CountPeople >= 4;
end;
Procedure Gained;
var
MyStuff : TMe;
begin
DebugThis('Gained Started.');
MyStuff := GetMe;
If not Players[CurrentPlayer].Booleans[5] then
begin
ProgressPlayer[CurrentPlayer].StartExp[1] := MyStuff.Experience[3];
ProgressPlayer[CurrentPlayer].StartExp[2] := MyStuff.Experience[4];
ProgressPlayer[CurrentPlayer].StartLevels[1] := SmartGetFieldArrayInt(0, MaxLevels, 3);
ProgressPlayer[CurrentPlayer].StartLevels[2] := SmartGetFieldArrayInt(0, MaxLevels, 4);
Players[CurrentPlayer].Booleans[5] := True;
Exit;
end;
ProgressPlayer[CurrentPlayer].ExpGain[1] := MyStuff.Experience[3] - ProgressPlayer[CurrentPlayer].StartExp[1];
ProgressPlayer[CurrentPlayer].ExpGain[2] := MyStuff.Experience[4] - ProgressPlayer[CurrentPlayer].StartExp[2];
ProgressPlayer[CurrentPlayer].LevelsGain[1] := SmartGetFieldArrayInt(0, MaxLevels, 3) - ProgressPlayer[CurrentPlayer].StartLevels[1];
ProgressPlayer[CurrentPlayer].LevelsGain[2] := SmartGetFieldArrayInt(0, MaxLevels, 4) - ProgressPlayer[CurrentPlayer].StartLevels[2];
end;
Function Lost: Boolean;
begin
Result := True;
If TileOnMS(Point(2528, 3372), 0)then
begin
Result := False;
Exit;
end else WalkToTile(Point(2528, 3372), 2, 0);
If TileOnMM(Point(2528, 3372))then
begin
Result := False;
Exit;
end;
Writeln('Lost!, can''t find the cage.');
end;
Procedure NewPlayer;
begin
SetAngle(True);
SetAllChats('on', 'off', '', 'off', 'off');
MarkTime(ProgressPlayer[CurrentPlayer].Time);
GetAllLevels;
Gained;
GetWeapon;
end;
Function NChangePlayer: Boolean;
begin
If PlayersActive > 2 then
begin
Writeln('LoggedOut. Cuase: Changing player.');
NextPlayer(True);
NewPlayer;
Result := True;
end;
end;
Procedure MaybeSleep;
var
v, h, Time: integer;
begin
Case Random(100) of
1..10:begin
If PlayersActive = 1 then
begin
If Not Players[CurrentPlayer].Booleans[1] Then
Exit;
LogOut;
v := RandomRange(4, 13);
h := v;
MarkTime(Time);
Repeat
Writeln('Sleeping for ' + IntToStr(v) + ' minutes');
Wait(1000*60*1);
v := v - 1;
Until(TimeFromMark(Time) > 1000*60*h);
end;
end;
11,12:begin
If PlayersActive = 1 then
begin
LogOut;
If Not Players[CurrentPlayer].Booleans[2] Then
Exit;
v := RandomRange(30, 120);
h := v;
MarkTime(Time);
Repeat
Writeln('Sleeping for ' + IntToStr(v) + ' minutes');
Wait(1000*60*1);
v := v - 1;
Until(TimeFromMark(Time) > 1000*60*h);
end;
end;
end;
end;
Function GetHp: Integer;
begin
Result := GetMe.Levels[3];
end;
Function CheckEat: Boolean;
var
CHp, i : Integer;
Begin
DebugThis('CheckEat Started.');
CHp := Round(Players[currentPlayer].Level[8] / 100 * RandomRange(40, 50));
If GetHp < CHp then
begin
Writeln('Low hp eating');
For i := 1 to 28 do
begin
If ExistsItem(i)then
begin
MMouseItem(i);
Wait(50);
If IsUpText('Eat')then
begin
MouseItem(i, True);
Result := True;
Exit;
end else
If i = 28 then
begin
RunAway('s', True, 2, 0);
LogOut;
Exit;
end;
end;
end;
end;
end;
Procedure TimeOuts;
begin
If Not LoggedIn then
begin
NextPlayer(False);
NewPlayer;
end;
If TimeFromMark(ProgressPlayer[CurrentPlayer].Time) > 60000*RandomRange(7, 20)then
begin
If Players[CurrentPlayer].Booleans[0] then
Logout;
MaybeSleep;
NChangePlayer;
LoginPlayer;
MarkTime(ProgressPlayer[CurrentPlayer].Time);
end;
end;
Procedure AntiRandoms;
Var
InFight: Tme;
begin
FindNormalRandoms;
InFight := GetMe;
If InFight.InFight then
RunAway('w', true, 1, RandomRange(2000, 5000));
end;
Procedure AntiBan;
Begin
Case Random(150) of
1: HoverSkill('random', False);
2: BoredHuman;
3: MouseBox(59, 31, 647, 264, 3);
5, 6: CheckEat;
7..11 : Dospec(75);
16..19: GameTab(RandomRange(1, 13));
end;
end;
Function N_Ranging: Boolean;
var
i, x : integer;
begin
FTWait(1);
repeat
x := SmartGetFieldObject(0, MyPlayer)
Result := SmartGetFieldInt(x, CharAnim) > -1;
SmartFreeObject(x);
Inc(i);
Wait(200+Random(100));
until(i > 7)or(result)or(Not(IsInteractingWithMeIndex(OgreIndex)));
end;
Function FindOgre: Boolean;
var
Ogres : Array of TNPCEx;
i, x, y : integer;
begin
If Not LoggedIn Then Exit;
Ogres := SortNPCsEx(GetNPCsByIDEx(2801));
If GetArrayLength(Ogres) = 0 then Exit;
For i:= 0 to High(Ogres) do
begin
If Ogres[i].InFight then Continue;
If Not TileOnMSEx(Ogres[i].Tile, 0)then
If Not WalkToTileMS(Point(2528, 3372), 0, 2)then
WalkToTile(Point(2528, 3372), 0, 2);
MMouse(Round(Ogres[i].MS.X), Round(Ogres[i].MS.Y), 10, 15);
Wait(150+Random(125));
If Players[CurrentPlayer].Booleans[4] then
begin
GetMousePos(x, y);
Mouse(x, y, 0, 0, False);
Wait(150+Random(100));
If ChooseOption('ttack')then
begin
Result := True;
OgreIndex := Ogres[i].Index;
Exit;
end else Exit;
end;
If Pos('gre', rs_GetUpText) > 0 then
begin
GetMousePos(x, y);
case Random(5) of
0 : begin
Mouse(x, y, 0, 0, False);
Wait(150+Random(100));
If ChooseOption('ttack')then
begin
Result := True;
OgreIndex := Ogres[i].Index;
Exit;
end;
end;
1..4: Begin
If Not Pos('gre', rs_GetUpText) > 0 then Exit;
Mouse(x, y, 0, 0, True);
Result := True;
OgreIndex := Ogres[i].Index;
Exit;
end;
end;
end else
begin
Result := FindOgre;
Exit;
end;
end;
end;
Procedure FightWait;
Begin
DebugThis('FightWait Started.');
FTwait(RandomRange(2, 4));
CheckEat;
WantOptions;
Inc(TotalAttacks);
Repeat
Wait(200);
WantOptions;
AntiRandoms;
AntiBan;
Until(Not(N_Ranging));
end;
procedure SaveDebug; //Thanks to whoever made this...
var
FileNum: integer;
begin
FileNum := RewriteFile(ScriptPath + 'Ogres.txt', True);
if (FileNum < 0) then
WriteLn('@@@ Error with save: File Error.');
WriteFileString(FileNum, GetDebugText);
CloseFile(FileNum);
end;
Function GetPaintBitmap(Color, sX, sY: Integer; Text: TStringArray; Dist: Integer): Integer;
Var
TPA: TPointArray;
H, Q, B: Integer;
Begin
Result := BitmapFromString(sX, sY, '');
For B := 0 To High(Text) Do
Begin
TPA := LoadTextTPA(Text[b], SmallChars, H);
For Q := 0 To High(TPA) Do
FastSetPixel(Result, TPA[q].x, TPA[q].y + B * Dist, Color);
End;
End;
Procedure ClearSMARTCanvas;
Var
BMP: Integer;
SMARTCanvas, Canvas: TCanvas;
Begin
BMP := BitmapFromString(765, 503, '')
SMARTCanvas := GetBitmapCanvas(BMP);
Canvas := GetBitmapCanvas(BMP);
SMARTCanvas.handle := SmartGetDebugDC;
CopyCanvas(Canvas, SMARTCanvas, 0, 0, 765, 503, -1000, -1000, 1000, 1000);
FreeBitmap(BMP);
End;
Procedure ProgressReportCanvas(X, Y: Integer);
Var
SCanvas, Canvas: TCanvas;
BMP, Sec : Integer;
AR, BR, AH, BH: Extended;
Text: TStringArray;
Mystuff: TMe;
Begin
Sec := GetTimeRunning Div 1000 + 1;
ClearSMARTCanvas;
BMP := BitmapFromString(765, 503, '');
SCanvas := GetBitmapCanvas(BMP);
SCanvas.handle := SmartGetDebugDC;
MyStuff := GetMe;
AR := MyStuff.Experience[4] - ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 4)-1);
BR := ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 4)) - ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 4)-1);
AR := Round((AR / BR) * 100);
Round(AR*100);
AH := MyStuff.Experience[3] - ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 3)-1);
BH := ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 3)) - ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 3)-1);
AH := Round((AH / BH) * 100);
Round(AH*100);
Text := [
'Has been running for : ' + TimeRunning,
'Tried to attack a total of ' + IntToStr(TotalAttacks) + ' Ogres.',
'Range exp until level(' + IntToStr(SmartGetFieldArrayInt(0, MaxLevels, 4)+1) + ') : ' + IntToStr(R_XpTillNextLevel(4)),
FloatToStr(AR) + '/100% to next Range level.',
'HP exp until level(' + IntToStr(SmartGetFieldArrayInt(0, MaxLevels, 3)+1) + ') : ' + IntToStr(R_XpTillNextLevel(3)),
FloatToStr(AH) + '/100% to next HP level.'];
Canvas := GetBitmapCanvas(GetPaintBitmap(255, 765, 503, Text, 25));
CopyCanvas(Canvas, SCanvas, 0, 0, 765, 503, X, Y, X + 765, Y + 503);
FreeBitmap(BMP);
End;
Procedure ProgressReport;
var
i, ii : integer;
s : string;
begin
If Not DebugMode then ClearDebug;
Gained;
TotalExp := 0;
TotalLevels := 0;
For i:= 0 to HowManyPlayers - 1 do
For ii:=1 to 2 do
begin
TotalExp := TotalExp + ProgressPlayer[i].ExpGain[ii]
TotalLevels := TotalLevels + ProgressPlayer[i].LevelsGain[ii]
end;
Writeln(' {-[]-¤ Multi Progress Report ¤-[]-}');
Writeln('[-{-[>] By N1ke! the genius. [<]-}-]');
Writeln('[-]');
Writeln('[-{-[>] Time running: ' + TimeRunning);
Writeln('[-{-[>] Total Exp: ' + IntToStr(TotalExp));
If ResponsesMade > 0 then Writeln('[-{-[>] Responses made: ' + IntToStr(ResponsesMade));
If TotalLevels > 0 then Writeln('[-{-[>] Total Levels: ' + IntToStr(TotalLevels));
For i:= 0 to HowManyPlayers - 1 do
begin
Writeln('[-]');
s := '[>] [' + BoolToStr(Players[i].Active) + '] Player: ' + SplitName(Players[i].Name) + ' / ';
If ProgressPlayer[i].ExpGain[1] > 0 then
s := s + 'HP Exp Gained: ' + IntToStr(ProgressPlayer[i].ExpGain[1]) + ' / ';
s := s + 'HP Exp/h: ' + IntToStr(Round(ProgressPlayer[i].ExpGain[1] / (GetTimeRunning / 3600000.0))) + ' / ';
If ProgressPlayer[i].ExpGain[2] > 0 then
s := s + 'Range Exp Gained: ' + IntToStr(ProgressPlayer[i].ExpGain[2]) + ' / ';
s := s + 'Range Exp/h: ' + IntToStr(Round(ProgressPlayer[i].ExpGain[2] / (GetTimeRunning / 3600000.0))) + ' / ';
If ProgressPlayer[i].LevelsGain[1] > 0 then
s := s + 'HP Level(s) Gained: ' + IntToStr(ProgressPlayer[i].LevelsGain[1]) + ' / ';
If ProgressPlayer[i].LevelsGain[2] > 0 then
s := s + 'Range Level(s) Gained: ' + IntToStr(ProgressPlayer[i].LevelsGain[2]) + ' / ';
Writeln(s);
end;
SaveDebug;
end;
Procedure Checker;
begin
CheckAmmo;
ProgressReport;
Counter := 0;
end;
Procedure WantOptions;
begin
Case Action Of
1: Begin
CloseQC;
TypeSend(TypeThis);
End;
2: DoSpec(75);
3: Begin
NextPlayer(True);
NewPlayer;
end;
4: Begin
NextPlayer(False);
NewPlayer;
end;
5: ProgressReport;
6: begin
ChangeWorld(0, True, False);
LoginPlayer;
end;
end;
Action := 0;
If IsFKeyDown(FKeyForOptions)then
OpenForm;
end;
Procedure MainLoop;
Begin
LogInPlayer;
NewPlayer;
Repeat
ProgressReportCanvas(XCordForSMARTProggie, YCordForSMARTProggie);
WantOptions;
DealWithCannon;
If Lost Then
begin
Logout;
TerminateScript;
end;
Inc(Counter);
DebugThis('-A-');
TimeOuts;
DebugThis('-B-');
If Crowded then
begin
DebugThis('-C-');
LogOut;
ChangeWorld(0, True, False);
LoginPlayer;
end;
WantOptions;
DebugThis('-D-');
If Counter > RandomRange(7,15) then Checker;
DebugThis('-G-');
If(Not(LoggedIn))Then
begin
DebugThis('-H-');
FTwait(8);
If(Not(LoggedIn))Then
begin
NextPlayer(False);
DebugThis('-I-');
NewPlayer;
end;
end;
DebugThis('-J-');
WantOptions;
If Not FindOgre then
begin
If Lost Then LogOut;
AntiRandoms;
end else FightWait;
DebugThis('-L-');
WantOptions;
Case Random(20) of
0,1,3: AntiBan;
2: CheckEat;
end;
DebugThis('-M-');
Until(False);
DebugThis('-N-');
end;
begin
SetupSRL;
SmartSetupEx(65, False, True, False);
Wait(5000);
SetTargetDC(SmartGetDC);
while not SmartActive do wait(100);
SetupReflection;
DeclarePlayers;
SetupAutoResponder(90, True);
Case Random(3) of
0: If Not LoggedIn then ChangeWorld(0, True, False);
end;
MainLoop;
end.