SRL Archive - Archive

JM Comp #1 - Script #5 - RM: Done


Sir R. M8gic1an

2009-08-12 14:55:36

This is here for people to give opinions. Do take into account this was for #30 or something.


{------------------------------------------------------------------------------]
___________ __ __ Ver 0.1
\__ ___/|__| ____ | | __ ___ __ ___ __
| | | |_/ ___\ | |/ /< | |< | |
| | | |\ \___ | < \___ | \___ |
|____| |__| \___ >|__|_ \ / ____| / ____|
\/ \/ \/ \/

Rimmington Miner
By ****

[------------------------------------------------------------------------------]
[- DESCRIPTION ]
[------------------------------------------------------------------------------]

This Script will Mine And Bank at falador or Mine And Sell at General Store
All Ores(Copper, Tin, Clay, Iron, Gold) are Possible.
Start it At Rimmington Mine.

[------------------------------------------------------------------------------}

program RimmingtonMiner;
{.include SRL\SRL.scar}
{.Include SRL\SRL\Skill\Mining.scar}


procedure DeclarePlayers;
begin
HowManyPlayers := 2;
NumberOfPlayers(HowManyPlayers);
CurrentPlayer := 0;

Players[0].Name := '';
Players[0].Pass := '';
Players[0].Nick := '';
Players[0].Pin := ''; // Bankpin
Players[0].Active := True;
Players[0].Booleans[0] := True; // Bank or Sell ( True = Bank | False = Sell )
Players[0].Integers[1] := 60; // How many Loads
Players[0].Strings[1] := 'Copper'; // Ore Type - See Line 17.

Players[1].Name := '';
Players[1].Pass := '';
Players[1].Nick := '';
Players[1].Pin := ''; // Bankpin
Players[1].Active := False;
Players[1].Booleans[0] := True; // Bank or Sell ( True = Bank | False = Sell )
Players[1].Integers[1] := 60; // How many Loads
Players[1].Strings[1] := ''; // Ore Type - See Line 17.

end;

Const
RunDir = 's'; // Run when at fight.
newcopper = rimmington_Copper;
newtin = rimmington_Tin;
newiron = rimmington_Iron;
newgold = rimmington_Gold;
newclay = rimmington_Clay;
nub1 = 5865372;
nub2 = 3097926;

var
Loads, Antiban, Ores, x, y, Gasses : Integer;

{==============================================================================]

- DON'T HAVE TO TOUCH ANYTHING BELOW HERE -

[==============================================================================}

function WhichOre : integer;
begin
case Lowercase(Players[CurrentPlayer].Strings[1]) of
'tin' : Result := newtin;
'copper' : Result := newcopper;
'iron' : Result := newiron;
'gold' : Result := newgold;
'clay' : Result := newclay
end;
end;

{ -------------------------------------------------- }

function DTMs(DTM: String): Integer;
begin
case Lowercase(DTM) of
'copper': Result := DTMFromString('78DA63B4676460C86600034608C570BDC6828' +
'11D89CFE8096465A0AAE9C8F74355E3026415A2AA5914A785AAC6' +
'1AC82A43555391E882AA461FC8CA4155E36AA18EAAC600C82A415' +
'5036221AB0100167509FF');

'tin': Result := DTMFromString('78DA63CC616460C86500034608C5D0D3DCC4C' +
'005E5FF0702C612202B03554D5B8E0F5C0D58BC10C82A40559399' +
'9488AA261DC82A43555391E882AA2616C8CA475593146081AA260' +
'6C82A4155036221AB010087290F63');

'gold': Result := DTMFromString('78DA634C61606098C100068C108AE1DA7A690' +
'62E28FF3F10306603195351D554A7B8C1D580C5B380C45C543527' +
'9748A1AA8903120B51D514C53AA2AA890012D350D5240558A0AA0' +
'903127350D55424BAA0AA0901120B50D58058C86A00B5CA1292');

'iron': Result := DTMFromString('78DA639CCEC8C090C300068C108AC1D740858' +
'10BCAFF0F048C7381AC025435D62AD2703560F18540563AAA9A8E' +
'7C3F54359380AC32543545B18EA86A3A81AC5C5435A1AE06A86A3' +
'A80AC1254352016B21A00D6FA0E9E');
end;
end;

procedure FreeThem(DTM: Integer);
begin
FreeDTM(DTM);
end;

{ -------------------------------------------------- }

function DeadTree: Integer;
var
arP: TPointArray;
arC: TIntegerArray;
tmpCTS, i, arL: Integer;
H, S, L: Extended;
X, Y, Z: Extended;
begin
tmpCTS := GetColorToleranceSpeed;
ColorToleranceSpeed(1);

FindColorsSpiralTolerance(MMCX, MMCY, arP, 1518397, MMX1, MMY1, MMX2, MMY2, 43);
if (Length(arP) = 0) then
begin
Writeln('Failed to find the color, no result.');
ColorToleranceSpeed(tmpCTS);
Exit;
end;

arC := GetColors(arP);
ClearSameIntegers(arC);
arL := High(arC);

for i := 0 to arL do
begin
ColorToHSL(arC[i], H, S, L);

if (H >= 1.96) and (H <= 15.27) and (S >= 30.21) and (S <= 100.02) and (L >= 7.82) and (L <= 26.29) then
begin
ColorToXYZ(arC[i], X, Y, Z);

if (X >= 1.14) and (X <= 6.10) and (Y >= 0.98) and (Y <= 5.99) and (Z >= 0.12) and (Z <= 3.33) then
begin
Result := arC[i];
Writeln('AutoColor = ' + IntToStr(arC[i]));
Break;
end;
end;
end;

ColorToleranceSpeed(tmpCTS);

if (i = arL + 1) then
Writeln('AutoColor failed in finding the color.');
end;

{ -------------------------------------------------- }

Procedure ProgressReport;
begin // Lazy to add PADR
cleardebug;
WriteLn('============= Rimmington Miner V0.1 ==============|');
WriteLn('|| Loads Done: ' + IntToStr(Loads) + 'Times ');
WriteLn('|| Performed AntiBan: ' + IntToStr(AntiBan) + 'Times ');
WriteLn('|| Ores Banked or Sold: ' + IntToStr(Ores));
WriteLn('|| Ran For: ' + TimeRunning);
WriteLn('==================================================|');
end;


{ -------------------------------------------------- }

Procedure TehStarting;
Begin
ClearDebug;
Wait(1000)
WriteLN(' Rimmington Miner ')
Wait(1500)
WriteLN(' Made By ')
WriteLN('___________ __ __ ')
Wait(250)
WriteLN('\__ ___/|__| ____ | | __ ___ __ ___ __ ')
Wait(250)
WriteLN(' | | | |_/ ___\ | |/ /< | |< | |')
Wait(250)
WriteLN(' | | | |\ \___ | < \___ | \___ |')
Wait(250)
WriteLN(' |____| |__| \___ >|__|_ \ / ____| / ____|')
Wait(250)
WriteLN(' \/ \/ \/ \/ ')
Wait(2000)
End;

{ -------------------------------------------------- }

Procedure OutOfStuck;
Begin
if(not(FindObjRock(x, y, WhichOre)))then
begin
repeat
SetAngle(False);
MakeCompass(Inttostr(Random(360)));
Until FindObjRock(x, y, WhichOre);
end;
end;

{ -------------------------------------------------- }

Procedure RandomCheck;
begin
FindNormalRandoms;
if FindFight then
begin
MakeCompass('n');
mouse(630, 154, 5, 5, True);
fflag(0);
SleepAndMoveMouse(15000+random(5000));
Mouse(630, 15, 5, 5, True);
SleepAndMoveMouse(2000 + random(2000));
fflag(0);
end;
end;

{ -------------------------------------------------- }

procedure AntiBanz;
begin
If(not LoggedIn)then Exit;
Case Random(22) of
0: MMouse(Random(MSX2),Random(MSY2),0,0);
1: HoverSkill('random',false);
2: PickupMouse;
3: GameTab(1+Random(12));
4: SleepAndMoveMouse(400+Random(1500));
5: if Random(2) = 1 then MMouse(1, 338, 515, 165);
6: if Random(2) = 1 then MMouse(515, 1, 250, 503);
7: RandomMovement;
8:
begin
case Random(3) of
0:
begin
KeyDown(VK_RIGHT);
Wait(500+Random(2000));
KeyUp(VK_RIGHT);
end;
1:
begin
KeyDown(VK_Left);
Wait(500+Random(2000));
KeyUp(VK_Left);
end;
2:
begin
case Random(2) of
0:
begin
KeyDown(VK_RIGHT);
Wait(500+Random(1400));
KeyUp(VK_RIGHT);
end;
1:
begin
KeyDown(VK_Left);
Wait(500+Random(1400));
KeyUp(VK_Left);
end;
end;
end;
end;
end;
end;
Gametab(4);
AntiBan := Antiban + 1;
ProgressReport;
end;

{ -------------------------------------------------- }

procedure HandleGas;
begin
Mouse(MMCX + 10, MMCY + 10, 5, 5, True);
SaveScreenshot(ScriptPath + 'Found gas ' + TimeRunning + '.bmp');
Flag;
Inc(Gasses);
end;

{ -------------------------------------------------- }

Procedure WalkToMine;
begin
MakeCompass('n');
RadialRoadWalk(FindFallyRoadColor, 270, 115, 60, 1, 1);
flag;
RadialRoadWalk(FindFallyRoadColor, 145, 205, 73, -1, 1);
flag;
if not RadialRoadWalk(FindRoadColor, 220, 140, 70, 1, 1) then
begin
Writeln('Using Failsafe 2-1!');
Disguise('Using Failsafe!');
RadialWalk(FindRockColor, 210, 150, 73, 2, 2);
end;
if not RadialRoadWalk(FindRoadColor, 220, 140, 73, 2, 2) then
begin
Writeln('Using Failsafe 2-2!');
Disguise('Using Failsafe!');
RadialWalk(FindRockColor, 310, 200, 69, 1, 1);
end;
if not RadialRoadWalk(FindRoadColor, 310, 230, 71, 1, 1) then
begin
Writeln('Using Failsafe 2-3!');
Disguise('Using Failsafe!');
RadialWalk(FindRockColor, 300, 220, 70, 2, 2);
end;
if not RadialWalk(FindRoadColor, 180, 330, 72, 1, 1) then
begin
Writeln('Using Failsafe 2-4!');
Disguise('Using Failsafe!');
RadialWalk(FindRockColor, 145, 295, 73, 2, 2);
end;
RadialWalk(DeadTree, 220, 140, 71, 1, 1);
MMouse(x, y, rx, ry);
if not RadialWalk(FindStoneColor, 210, 150, 70, 2, 2) then
begin
Disguise('Using Failsafe!');
RadialWalk(FindRoadColor, 180, 330, 60, 1, 1);
RadialWalk(FindStoneColor, 210, 150, 70, 2, 2);
end;
if (FindSymbol(x, y, 'Mining spot')) then
Begin
Disguise('We are back...');
Mouse(x, y, 5, 5, True);
end;
OutOfStuck;
end;

{ -------------------------------------------------- }

procedure Bank;
var
Tries: Byte;
begin
wait(randomRange(1000, 2000));
SetAngle(True);
if (not(Loggedin)) then exit;
Inc(Tries);
repeat;
OpenBank('veb', True, True);
until (BankScreen) or (PinScreen) or (Tries > 30);
if (PinScreen) then
InPin(Players[CurrentPlayer].Strings[0]);
if (BankScreen) then
begin
Deposit(2, 28, True);
CloseBank
end;
ProgressReport;
WalkToMine;
end;

{ -------------------------------------------------- }

Procedure WalkToBank;
Begin
if (FindSymbol(x, y, 'Mining spot')) then
Begin
Mouse(x, y, 5, 5, True);
end;
MakeCompass('W');
wait(1111);
if not RadialWalk(FindStoneColor, 70, 160, 70, 1, 1) then
begin
Writeln('Using Failsafe 1-1!');
Disguise('Using Failsafe!');
RadialWalk(FindRockColor, 70, 160, 35, 1, 1);
end;
if not RadialRoadWalk(FindRoadColor, 160, 40, 70, 1, 1) then
begin
Writeln('Using Failsafe 1-2!');
Disguise('Using Failsafe!');
RadialWalk(DeadTree, 70, 110, 70, 1, 1);
end;
MakeCompass('n');
wait(1111);
RadialRoadWalk(FindRoadColor, 120, 10, 70, 2, 2);
Wait(RandomRange(100, 300));
RadialRoadWalk(FindRoadColor, 20, 135, 70, 0, 1);
flag;
MakeCompass('W');
wait(randomRange(600, 800));
if not RadialRoadWalk(FindRoadColor, 65, 115, 70, 0, 1) then
begin
Writeln('Using Failsafe 1-3!');
Disguise('Using Failsafe!');
RadialWalk(FindRockColor, 65, 115, 70, 1, 1);
end;
RadialRoadWalk(FindRoadColor, 70, 115, 60, 0, 1);
flag;
RadialRoadWalk(FindRoadColor, 70, 115, 60, 0, 1);
flag;
RadialRoadWalk(FindFallyRoadColor, 30, 120, 70, 1, 2);
if RadialRoadWalk(FindFallyRoadColor, 110, 60, 70, 2, 2) then
begin
SymbolAccuracy := 0.5;
If FindSymbol(x, y, 'Bank') Then
MouseFlag(x, y, 0, 0, 0)
else
SymbolAccuracy := 0.45;
end;
Bank;
end;

{ -------------------------------------------------- }

Procedure ToMinez;
Begin
ProgressReport;
Disguise('Walking to Mine!');
if (FindSymbol(x, y, 'Portal')) then
begin
Writeln('We Found the Portal Symbol');
Mouse(x, y, 2, 2, True);
flag;
end;
RadialWalk(FindRoadColor, 100, 30, 70, 1, 1);
Mouse(808, 222, 1, 1, True);
if (FindSymbol(x, y, 'Mining spot')) then
Begin
Mouse(x, y, 5, 5, True);
Disguise('Found Teh Mine!');
end;
OutOfStuck;
end;

{ -------------------------------------------------- }

function RemainingOres(var X, Y: Integer): String;
var
I: Integer;
begin
for I:= 0 to 3 do
begin
case I of
0: Result:= 'copper';
1: Result:= 'tin';
2: Result:= 'iron';
3: Result:= 'gold';
end;
if(FindDTM(DTMs(Result), X, Y, MIX1, MIY1, MIX2, MIY2)) then
Exit;
end;
Result:= '';
end;

{ -------------------------------------------------- }

procedure SellShit;
var
X, Y, Sold : Integer;
B: TBox;
RO: String;
begin
repeat
Wait(RandomRange(250, 500));
RO:= RemainingOres(X, Y);
Writeln('Remaining Ore = "' + RO + '"');
if(not(RO = '')) then
begin
Writeln('Found ' + Capitalize(RO) + ' at slot ' + IntToStr(CoordsToItem(X, Y)));
B:= InvBox(CoordsToItem(X, Y));
MouseBox(B.X1, B.Y1, B.X2, B.Y2, 2);
Wait(200 + Random(300));
ChooseOption('50');
Wait(1000 + Random(500));
end;
until(RO = '');
ToMinez;
end;

{ -------------------------------------------------- }

Procedure WalkToShop;
begin
if(not LoggedIn)then Exit;
if(InvFull)then
begin
Disguise('Walking to the shop!');
if (FindSymbol(x, y, 'Mining spot')) then Mouse(x, y, 2, 2, True);
MakeCompass('n')
flag;
if not RadialRoadWalk(FindRoadColor, 225, 180, 73, 1, 1) then
begin
Writeln('Using Failsafe!');
Disguise('Using Failsafe!');
Mouse(576, 141, 1, 1, True);
flag
Mouse(581, 131, 1, 1, True);
end;
flag;
RadialRoadWalk(FindRoadColor, 290, 250, 40, 2, 2);
if (FindSymbol(x, y, 'Portal')) then
begin
Writeln('We Found the Portal Symbol');
Mouse(x, y, 5, 5, True);
flag;
end;
if not RadialWalk(FindLadderColor, 300, 200, 70, 1, 1) then
begin
Writeln('Using Failsafe!');
Disguise('Using Failsafe!');
if (FindSymbol(x, y, 'shop')) then
Mouse(x, y, 1, 1, true);
end;
flag;
repeat
Wait(6000);
until (FindObjCustom(x, y, ['hop'], [nub1, nub2], 3));
Wait(Random(150));
Mouse(x, y, 0, 0, False);
ChooseOption('Trade');
wait(2000 + Random(6000));
end;
Sellshit;
end;

{ -------------------------------------------------- }

Procedure Starting;
Begin
Disguise('Setting up.');
Wait(6000);
Setrun(true);
GameTab(4);
SetAngle(false);
if (FindSymbol(x, y, 'Mining spot')) then
Begin
Mouse(x, y, 5, 5, True);
end;
Wait(2500);
if(not(FindObjRock(x, y, WhichOre)))then
begin
MakeCompass('S');
Wait(Random(500));
end;
OutOfStuck;
end;

{ -------------------------------------------------- }

procedure MineOre;
var
f : integer;
begin
Wait(Random(500))
if(not LoggedIn)then Exit;
x := MSCX;
y := MSCY;
if FindObjRock(x, y, WhichOre)then
begin
if(not FindGas(x, y))then
begin
Disguise('Found teh rock... Attempting to mine');
Case (Random(3)) of
0, 2: begin
Wait(random(100));
Mouse(x, y, 2, 2, False);
ChooseOption('Mine');//otherwise it may Examine
end;
1: Mouse(x, y, 2, 2, True);
end;
if(not(FindObjRock(x, y, WhichOre)))then
begin
repeat
SetAngle(False);
MakeCompass(Inttostr(Random(360)));
Until FindObjRock(x, y, WhichOre);
end;
Wait(Random(50));
Flag;
MarkTime(f);
Disguise('Mining rock...');
Wait(Random(50));
repeat
Wait(Random(200));
RandomCheck;
Wait(Random(50));
case (Random(3))of
0: AntiBanz;
end;
Wait(Random(50));
until (FindGas(x, y))or(FindBlackChatMessage('anage'))or(TimeFromMark(f) > 8000)or(InvFull);
if(FindGas(x, y))then
HandleGas;
end;
if(InvFull) then
begin
if (Players[CurrentPlayer].Booleans[0] = True) then
begin
Disguise('Walking to Bank');
Ores := Ores + 28;
Loads := Loads + 1;
ProgressReport;
WalkToBank;
end else
Disguise('Walking to Shop');
WalkToShop
end;
end;
RandomCheck;
end;

{ -------------------------------------------------- }

Procedure MainLoop;
var
Loads : integer;
begin
Wait(222);
repeat
if(not LoggedIn)then LoginPlayer;
repeat
MineOre;
wait(100);
MineOre;
RandomCheck;
until (Loads >= (Players[CurrentPlayer].Integers[1])) or (not LoggedIn);
NextPlayer(Players[CurrentPlayer].Active);
until false;
end;

{ -------------------------------------------------- }

begin
SetupSRL;
SetupMining;
TehStarting;
DeclarePlayers;
LoginPlayer;
Starting;
Mainloop;
end.


1. Technique (/100)
2. Individuality (/100)
3. Follow all SRL rules (/100)
4. Creativity (/100)
5. Efficiency (/100)
6. Presentation (/100)
7. Meeting all Requirements (/100)
8. Added Extras (/100)

~RM

marpis

2009-08-14 16:27:51

1. Technique (20/100)
- lack of walking failsafes
- infinite loops
+ Autocolor, but its made with ACA so it's not really a big plus

2. Individuality (**/100)
- Nothing special to say here

3. Follow all SRL rules (**/100)
- lack of if not loggedin then exit;
- infinite loops
- Multiplayer doesn't work properly, cause you never set players[x].active to false
- SellShit: improper name

4. Creativity (**/100)
+ RemainingOres function
- No imagination used on walking

5. Efficiency (**/100)
- Doesn't free DTMs
- Calls FindObjRock too many times

6. Presentation (**/100)
+ Decent instructions, clear DeclarePlayers
- Non-multiplayer proggy

7. Meeting all Requirements (**/100)
+ Yup

8. Added Extras (**/100)
+ Banking

Total: **/800 = **.*%

Gu3st...

2009-08-14 23:43:46

Technique: (**/100)
- You should add more failsafes.
+ Not many global vars.
+ Autocolor but it is ACA.

Inidividuality: (**/100)
- Nothing special.

Follow all SRL Rules: (**/100)
- DTMs not free'ed.
- ALOT of infinite loops.
+ Good use of "if not LoggedIn then Exit;".

Creativity: (**/100)
- Could have made better anti-ban.

Efficiency: (**/100)
- Too many long waits.
- DTMs not free'ed making SCAR crash eventually.

Presentation: (**/100)
+ Heading but it could be better.
+ Basic progress report.
+ Intro.
+ Comments.

Meeting all requirements: (**/100)
+ Yes.

Added extras: (**/100)
+ Banking!

Total (**/800) = **.**%

Coh3n

2009-08-16 01:38:25

In your antiban procedures, you don't have to write all this out:

begin
KeyDown(VK_RIGHT);
Wait(500+Random(2000));
KeyUp(VK_RIGHT);
end;
You can simply say:

MakeCompass(30 + Random(40));
Or whatever angle you choose. Basically it does the same thing, in much less lines. :D

In this little part:

repeat
Wait(6000);
until (FindObjCustom(x, y, ['hop'], [nub1, nub2], 3));
I would suggest just having it wait maybe 100ms instead of 6 seconds. Makes it much faster once the object is found. :)

1. Technique (**/100)
  • Positives
    • Very little global variables.
    • Good use of constants.
    • Not bad failsafes in your walking procedures, but could be much better.
  • Negatives
    • I didn't see any use of TPAs.
    • Using coordinate clicking is a BIG no no! No one is going to click the same coordinates over and over again.
    • Doesn't use very many loops.
2. Individuality (**/100)
  • Positives
    • I like how you used a lot of custom functions.
    • I like the way you load your DTMs, so you can load one at a time if needed.
  • Negatives
    • Used ACA.
3. Follow all SRL rules (**/100)
  • Positives
    • Free's DTMs, although a whole new function isn't really needed.
  • Negatives
    • There are a couple unneeded begin..end nests.
4. Creativity (**/100)
  • Positives
    • Functions such as RemainingOres and your use of failsafes shows me you do have some creativity.
    • Random right/left click with click the rocks, although you should right click much less.
5. Efficiency (**/100)
  • Positives
    • Having the option to load only one DTM at a time is very efficient, in my opinion. :)
    • Great use of cases and functions.
  • Negatives
    • May want to use some "else" statements when working with cases.
6. Presentation (**/100)
  • Positives
    • Nice header.
    • Nice progress report.
    • Awesome signature!
    • Standards are awesome from what I can see.
    • Awesome comments and separation of each function/procedure.
7. Meeting all Requirements (**/100)
  • Negatives
    • Didn't see any procedure/function that checks for a pickaxe.
8. Added Extras (**/100)
  • Positives
    • Banking
    • Clay mining

Total: **/800 = **.*%

Markus

2009-08-24 02:29:45

lol @ fail attempt of taking name out lol.
*points to the nice ASCII art at the top of the script (paste it in SCAR).*

Sir R. M8gic1an

2009-09-05 19:06:37

Technique(…/100)
[INDENT]- lack of walking failsafes
- infinite loops
+ Autocolor, (ACA)
+ Not many global vars.
+ Good use of constants.[/INDENT]

Individuality
(…/100)
[INDENT]+ Custom Functions
+ Nice way of loading DTMs
- ACA
[/INDENT]
Follow all SRL Rules(…/100)
[INDENT]- Although you have a DTM freeing procedure, you don't free them.
- lack of if not loggedin then exit;
- infinite loops
- SellShit: improper name
[/INDENT]
Creativity (**/100)
[INDENT]+ RemainingOres function
- Little imagination used on walking, you can find more ways of figuring out where you are.
+ Random right/left click with click the rocks, although you should right click much less.
[/INDENT]
Efficiency (**/100)
[INDENT]- Doesn't free DTMs
- Calls FindObjRock too many times
- Too many long waits.
+ Having the option to load only one DTM at a time is very efficient
+ Great use of cases and functions.
- May want to use some "else" statements when working with cases.[/INDENT]

Presentation (…/100)
[INDENT] + Nice header.
+ Nice progress report.
+ Awesome signature!
+ Good Standards
+ Nice Separation of functions
- Not many comments throughout the script
- No function / procedure header
- No Player Report[/INDENT]

Meeting all Requirements (**/100)
[INDENT] + All Reqs met
- Doesn't check if PickAxe is in Inv or Equipped, or if doesn't have one at all.[/INDENT]

Added Extras
(**/100)
[INDENT] + Banking
+ Clay Mining[/INDENT]


Total Score: (… / 800) = ..%

Sir R. M8gic1an

2009-09-05 19:10:39

Done, and now the usual question, did i miss anything?

~RM