PDA

View Full Version : How To Write Your First Script: Collecting and Banking Cabbages!



StickToTheScript
06-10-2015, 03:37 AM
How To Write Your First Script: Collecting and Banking Cabbages!


Introduction


Hello everyone,

This is a tutorial on how to create your very first script using Simba and SRL6. There are two very useful tutorials that teach you the basics and what is available to you. These two tutorials are written by The Mayor, and can be found here:


Simplistic Beginners Guide To RS3 Scripting (https://villavu.com/forum/showthread.php?t=109161)
All-In-One RS3 and SRL6 Scripting Tutorial! (https://villavu.com/forum/showthread.php?t=107757)

The Mayor wrote out a script for you that runs, teleports, banks, and mines for you, but in-case you wanted a bit more of an explanation, you can freely read this tutorial.



What to expect in this tutorial


If you are new to Simba and SRL, or just do not have a good comprehension of scripting in general, this should help you out quite a bit.

We will be covering a lot of stuff, such as how to setup the script, create functions and procedures, how to use them properly, walking using SPS (More on this later), finding objects on the screen and clicking them, and even banking.

I will be referring quite often to The Mayor's tutorials. Please make sure you have read those.

We will be using tools such as ACA and SPS_Path_Generator, which will also be covered later.

So, lets get started...




Part 1: The Skeleton


Whenever you start scripting, you will want to start with a skeleton. What is it?! Let me show you...

program scriptTemplate;

{$DEFINE SMART} // Always have this to load smart
{$I SRL-6/SRL.simba} // To load the SRL include files
{$I SPS/lib/SPS-RS3.Simba} // To load the SPS include files

procedure declarePlayers();
begin
setLength(players, 1);
with players[0] do
begin
loginName := 'username';
password := 'password';
isActive := true;
isMember := true;
end
currentPlayer := 0;
end;


// main loop
begin
clearDebug(); // Clear the debug box
smartEnableDrawing := true; // So we can draw on SMART
setupSRL(); // Load the SRL include files
declarePlayers(); // Set up your username/pass

if not isLoggedIn() then // If player isn't logged in then
begin
players[currentPlayer].login(); // Log them in
exitTreasure(); // Exit treasure hunter
minimap.setAngle(MM_DIRECTION_NORTH); // Make compass north and angle high
mainScreen.setAngle(MS_ANGLE_HIGH);
end;

end.

This skeleton is from The Mayor's tutorial, which is linked above. To save as a default skeleton (HIGHLY RECOMMENDED), Simply copy and paste into untitled tab, click 'File', and then click 'Save as Default'.


This should be pretty self explanatory, but if not, the script simply logs the character in and adjusts the compass and angle.

I should not have to tell you too much about this because you should have read The Mayor's tutorials already.




Part 2: Before You Start To Actually Script...


Before the actual scripting starts, its always good to create a basic layout of what you want the script to do. In this case, we are going to be writing a script that Starts at the Combat Academy Chest in Lumby, and we are going to have it walk to the cabbage patch, pick up a full inventory, walk back to the bank, open bank, deposit all object and close bank, and then repeat.

To start off, we are going to create procedures and functions for each of those steps...

So, with the knowledge you now have, you should have a script that looks reletively similar to this:

program scriptTemplate;

{$DEFINE SMART} // Always have this to load smart
{$I SRL-6/SRL.simba} // To load the SRL include files
{$I SPS/lib/SPS-RS3.Simba} // To load the SPS include files

procedure declarePlayers();
begin
setLength(players, 1);
with players[0] do
begin
loginName := '';
password := '';
isActive := true;
isMember := true;
end
currentPlayer := 0;
end;

procedure walkToCabbies();
begin

end;

procedure walkToBank();
begin

end;

procedure clickCabbies();
begin

end;

procedure bank();
begin

end;

procedure depositLoot();
begin

end;

procedure mainLoop();
begin

end;

begin
clearDebug();
smartEnableDrawing := true;
setupSRL();
declarePlayers();

players[currentPlayer].login();
exitTreasure();
minimap.setAngle(MM_DIRECTION_NORTH);
mainScreen.setAngle(MS_ANGLE_HIGH);

end.

As you can see, we have a lot of procedures. You can freely make some of them functions to help you with fail-safes, but I just want to get to the point, so I'm leaving them all as procedures.

So, that is our essential layout. You will notice that I have a Mainloop. You might be thinking "Why would he have a mainloop?", well let me explain.

A mainloop is not essential, but it helps. It keeps things organized and allows things to look a bit more clean. It also helps you as a scripter to know where the 'control room' is. It is the place where all of our stuff happens, where things get told to run, and where things get repeated and checked, etc!

Anyways, lets continue..




Part 3: The Fun Scripting Part!


Finally, we are where we need to be with the scripting part. How does it work? You should know the basics by now. If not, go read The Mayor's tutorials at the top of this tutorial.

Where should we start with the scripting? Wherever you want! But for today, we will start with the banking procedure.





3.1: Banking


Some people have different ways of banking. Some people make their own forms of banking, while others use the built-in banking options that come with SRL6. Today, we will be using the built-in options.

To do this, we will be banking at this chest:

http://i.imgur.com/DpWRMkd.png

To use this chest, we have a wonderfully easy piece of code we can use.

This would be:

bankScreen.open(BANK_CHEST_LUMBRIDGE)

This simply does all the work for you. So, what I have done is put it into the procedure 'bank'.


procedure bank();
begin
if bankScreen.open(BANK_CHEST_LUMBRIDGE) then
wait(randomrange(1500,2500))
else
begin
writeln('Did not open bank. We failed. Termination in progress.');
Terminatescript;
end;
end;

Now, as you can see, I put the open bank option in an If...Then... statement. Why? Because we are telling the script to run the open bank option, but in a slightly different way. The reason why I wrote it like this is because we can give it a wait. The reason I give it a wait is because I like to play it safe and give room for lag.

You will notice that after the else statement, I have the writeln line, along with the terminate line. That is a fail-safe in the case that the script cannot find the bank. It will tell you that it couldnt find the bank, and then it will stop the script.

You can freely write it in a different way, where it repeats until the bank is open, but that is up to you.




3.2: Depositing The Cabbages


Yep! We get to deposit.

This part is really not hard because SRL6 also comes with some built-in options for this too!

So, for the script, this is what I have written out:

procedure depositLoot();
begin
if bankScreen.isOpen() then
begin
bankScreen.quickDeposit(QUICK_DEPOSIT_INVENTORY);
wait(randomRange(1000, 2000));
bankScreen.close();
end else
begin
writeLn('Couldn''t find the bank for some reason!');
Terminatescript;
end;
end;

Now, notice I have it check for the bank screen. The reason why is because the script would not be able to deposit anything if the bankscreen wasnt open. So, I have it check for it, and if it is, you see that it will deposit everything in the inventory, and then proceed to close the bank. I also have a wait between the deposit and the close options in the bank. This is just so that things don't happen too fast.

Same as in the previous procedure for the bank, we have the writeln and terminate lines.


Another possible way to deposit into the bank is by setting up a preset. You can setup a preset to be blank and when it clicks the preset button, it will deposit and close the bank. This shortens the amount of code needed, plus you do not need to add the bankScreen.close() line. You could write it as such:

procedure depositLoot();
begin
if bankScreen.isOpen() then
begin
// Configure which preset to use in the setup
bankScreen.clickButton(PRESET_BUTTON)
// where PRESET_BUTTON is a user setup constant
end else
begin
writeLn('Couldn''t find the bank for some reason!');
Terminatescript;
end;
end;
Thanks to Incurable for the idea (post is below (https://villavu.com/forum/showthread.php?t=113433&p=1346120#post1346120)).








3.3: Walk To Cabbages


Alright. This is where we get the fun of using SPS!

SPS is a great tool for trying to walk around Runescape. To read more about it, you can read here:

SRL Positioning System (OFFICIAL THREAD) (https://villavu.com/forum/showthread.php?t=66266)

The Mayor also explains it wonderfully in his All-In-One RS3 Tutorial, which is at the top of this thread. I will show you how I made my map using the SPS Path Generator tool found here (https://villavu.com/forum/showthread.php?t=80134).

So, I loaded my Lumby.png picture that I have saved in my C:\Simba\Includes\SPS\img\runescape_surface folder. You will want to save pictures for SPS there because you will use that location to call them in the script. We will get to that right now.


So, before we do any walking or anything, we need to setup the script for SPS. To do this, we need to include it at the top of our script, which we did with the skeleton posted above, where you see SPS is included in the script.

We also need to include a bit of extras in the setup part of the script.

This is what you should add:


begin
clearDebug();
smartEnableDrawing := true;
setupSRL();
declarePlayers();

SPS.setup('Lumby', RUNESCAPE_SURFACE); //NOTICE THIS
SPSanyangle := false;

players[currentPlayer].login();
exitTreasure();
minimap.setAngle(MM_DIRECTION_NORTH);
mainScreen.setAngle(MS_ANGLE_HIGH);

end.

Here we set up SPS using the SPS.setup option written into the SPS include. This allows us to use SPS. Notice how we also loaded our picture 'Lumby' and stated that it is in the RUNESCAPE_SURFACE folder. If you have not downloaded the Lumby.png yet, it will be at the bottom of this tutorial.

Note: If the picture is not in the RUNESCAPE_SURFACE folder, then the script will not load a SPS map, and therefore will not walk.




Now, back to the walk to cabbages part...

With the SPS tool that I linked above, we will create a path like this:

http://i.imgur.com/wpA4rKc.jpg

This path is not the exact one written in the procedure below. But it is pretty close...

Now, to copy a path that you made, click the 'Copy Path Array' button at the top of the client.

Now, the basis of the procedure:

procedure walkToCabbies();
var
pathToCabbies: TPointArray;
begin
if not isLoggedIn() then
exit;

pathToCabbies := [Point(215, 172), Point(203, 172), Point(189, 167), Point(173, 165), Point(165, 159), Point(154, 150), Point(140, 139), Point(140, 124), Point(133, 120), Point(126, 114), Point(119, 109), Point(104, 107)];

if SPS.walkPath(pathToCabbies) then
minimap.waitPlayerMoving()
else
writeln('Failed Walk to Cabbies...');
end;

Alright. This procedure will walk you to where you need to go, which is the cabbage field in this case. Notice how we have our variables called. Dont forget to do this, or the script wont work.

We also loaded the Path to Cabbages, and we told the script to walk using SPS.walkPath().

Notice I also used the minimap.waitPlayerMoving() option. I used that to make sure that we were not moving so that our mouse doesn't go crazy when looking for colours. I consider it a fail-safe. You can also use it in other situations, which you will see later when we begin to pickup cabbages.





3.4: Finding and Clicking on the Cabbies!


There are many ways to find and pickup cabbages. In this case, what we are going to do is use my good friend mainscreen.findObject().

Here is what our Cabbages look like:

http://i.imgur.com/jqTghI4.jpg

Here is our basic procedure for finding cabbages:

procedure clickCabbies();
var
x, y: integer;
begin
if not isLoggedIn() then
exit;

mainscreen.findObject(x, y, 2602604, 19, colorSetting(2, 0.23, 0.88), mainscreen.playerPoint, 5, 5, 5, ['abbage'], MOUSE_LEFT);
wait(randomrange(2000,3500));
minimap.waitPlayerMoving();
end;

The colours have already been chosen using the ACA tool found here. (https://villavu.com/forum/showthread.php?t=26944)

When choosing colours, your goal is to pick as many possible unique colours that there are for the specific object. You also want to have the object as close to completely coloured red in the ACA tool like this:

http://i.imgur.com/drqkVSy.png


What we are doing here is finding our cabbage colours on the main RS screen and then waiting after we clicked. Notice I used the minimap.waitingPlayerMoving() again. This is because we don't want to be moving when the script begins to try to find more cabbage!

Once again, I will state that if you do not understand what a lot of this stuff is, please read The Mayor's tutorials. It will go into greatly explained detail of how the mainscreen.findobject works and what each little setting stands for.





3.5: Walk back to bank


To walk back to the bank, you can simply copy the same procedure you used for walking to the cabbages, but you simply rename the path variable and reverse the path. Like this:

procedure walkToBank();
var
pathToBank: TPointArray; //Variable changed to pathToBank
begin
if not isLoggedIn() then
exit;

pathToBank := [Point(104, 107), Point(119, 109), Point(126, 114), Point(133, 120), Point(140, 124), Point(140, 139), Point(154, 150), Point(165, 159), Point(173, 165), Point(189, 167), Point(203, 172), Point(215, 172)]; //Path Reversed

if SPS.walkPath(pathToBank) then
minimap.waitPlayerMoving()
else
writeln('Failed Walk to Bank...');
end;

This does the same thing as the SPS path that was done above.


This now is all of the main procedures that we need. We will now move onto the MainLoop!




3.6: Mainloop


Now we have to get our script to work. To do so, we are going to make our MainLoop. Our MainLoop contains our procedures and functions in the order in which we want them to run. You need to know that you cannot have a working script without calling the procedures. I've seen it before where people write functions and procedures and they do not call them in their MainLoop or at the bottom of their script, yet they are expecting it to work. If you want more clarification on this part, you can contact me and I will explain further, but you should be able to understand that if you want a procedure or function to run in the script, you must call it at some point (either indirectly or directly in the mainloop).

Our happy Mainloop will look like this:

procedure mainLoop();
begin

walkToBank;
bank;
depositLoot;
walkToCabbies;

repeat
clickCabbies;
until tabBackPack.isFull();

end;

Our MainLoop is very basic as of this moment. It simply calls the other procedures above it.

DO NOTE: A problem a lot of scripters have at the beginning is that they think that they can place procedures and functions wherever they want in the script. You CANNOT do that. This is because the script reads from the top down when compiling. If you were to try and put the mainloop under the delcarePlayers procedure, then the script would give you a compiling error.

This mainloop will get the job done, but realize that there are no fail-safes in it at the moment. That is where you get to be creative and make ways to have the script recover if there is a problem that it encounters.

In the Simba Code, you can see that the process is that the script will walk to the bank, open the bank, deposit the cabbages, close the bank, walk to the cabbages, pick up cabbages, and repeat.


Now, you might be thinking, "How do I get the script to run the mainloop?!"

Well, let me show you.

Remember this:

begin
clearDebug();
smartEnableDrawing := true;
setupSRL();
declarePlayers();

SPS.setup('Lumby', RUNESCAPE_SURFACE);
SPSanyangle := false;

players[currentPlayer].login();
exitTreasure();
minimap.setAngle(MM_DIRECTION_NORTH);
mainScreen.setAngle(MS_ANGLE_HIGH);

end.


You are going to want to add a small bit of code to it.. Three lines to be exact...

begin
clearDebug();
smartEnableDrawing := true;
setupSRL();
declarePlayers();

SPS.setup('Lumby', RUNESCAPE_SURFACE);
SPSanyangle := false;

players[currentPlayer].login();
exitTreasure();
minimap.setAngle(MM_DIRECTION_NORTH);
mainScreen.setAngle(MS_ANGLE_HIGH);

repeat
mainLoop();
until false;
end.


It simply repeats the mainloop forever! :stirthepot:

This will now call the mainloop into action, and go through the mainloop on a loop. Now, do note that you can run the script without a main loop, but it will look like this:

begin
clearDebug();
smartEnableDrawing := true;
setupSRL();
declarePlayers();

SPS.setup('Lumby', RUNESCAPE_SURFACE);
SPSanyangle := false;

players[currentPlayer].login();
exitTreasure();
minimap.setAngle(MM_DIRECTION_NORTH);
mainScreen.setAngle(MS_ANGLE_HIGH);

repeat

walkToBank;
bank;
depositLoot;
walkToCabbies;

repeat
clickCabbies;
until tabBackPack.isFull();

until false;
end.

But I find that the mainloop makes everything seem more clean..




4: The Finished Script


Alrighty! We have done it! We have finished our script! Its not perfect, but it definitely gets the job done!

Your final script should look like this:

program scriptTemplate;

{$DEFINE SMART} // Always have this to load smart
{$I SRL-6/SRL.simba} // To load the SRL include files
{$I SPS/lib/SPS-RS3.Simba} // To load the SPS include files

procedure declarePlayers();
begin
setLength(players, 1);
with players[0] do
begin
loginName := '';
password := '';
isActive := true;
isMember := true;
end
currentPlayer := 0;
end;

procedure walkToCabbies();
var
pathToCabbies: TPointArray;
begin
if not isLoggedIn() then
exit;

pathToCabbies := [Point(215, 172), Point(203, 172), Point(189, 167), Point(173, 165), Point(165, 159), Point(154, 150), Point(140, 139), Point(140, 124), Point(133, 120), Point(126, 114), Point(119, 109), Point(104, 107)];

if SPS.walkPath(pathToCabbies) then
minimap.waitPlayerMoving()
else
writeln('Failed Walk to Cabbies...');
end;

procedure walkToBank();
var
pathToBank: TPointArray;
begin
if not isLoggedIn() then
exit;

pathToBank := [Point(104, 107), Point(119, 109), Point(126, 114), Point(133, 120), Point(140, 124), Point(140, 139), Point(154, 150), Point(165, 159), Point(173, 165), Point(189, 167), Point(203, 172), Point(215, 172)];

if SPS.walkPath(pathToBank) then
minimap.waitPlayerMoving()
else
writeln('Failed Walk to Bank...');
end;

procedure clickCabbies();
var
x, y: integer;
begin
if not isLoggedIn() then
exit;

mainscreen.findObject(x, y, 2602604, 19, colorSetting(2, 0.23, 0.88), mainscreen.playerPoint, 5, 5, 5, ['abbage'], MOUSE_LEFT);
wait(randomrange(2000,3500));
minimap.waitPlayerMoving();
end;

procedure bank();
begin
if bankScreen.open(BANK_CHEST_LUMBRIDGE) then
wait(randomrange(1500,2500))
else
begin
writeln('Did not open bank. We failed. Termination in progress.');
Terminatescript;
end;
end;

procedure depositLoot();
begin
if bankScreen.isOpen() then
begin
bankScreen.quickDeposit(QUICK_DEPOSIT_INVENTORY);
wait(randomRange(1000, 2000));
bankScreen.close();
end else
begin
writeLn('Couldn''t find the bank for some reason!');
Terminatescript;
end;
end;

procedure mainLoop();
begin

walkToBank;
bank;
depositLoot;
walkToCabbies;

repeat
clickCabbies;
until tabBackPack.isFull();

end;

begin
clearDebug();
smartEnableDrawing := true;
setupSRL();
declarePlayers();

SPS.setup('Lumby', RUNESCAPE_SURFACE);
SPSanyangle := false;

if not isLoggedIn() then
begin
players[currentPlayer].login();
exitTreasure();
minimap.setAngle(MM_DIRECTION_NORTH);
mainScreen.setAngle(MS_ANGLE_HIGH);
end;

repeat
mainLoop();
until false;
end.

You can always add some lines to split up the script to make it easier to read. So, it could look like this:

program scriptTemplate;

{$DEFINE SMART} // Always have this to load smart
{$I SRL-6/SRL.simba} // To load the SRL include files
{$I SPS/lib/SPS-RS3.Simba} // To load the SPS include files

{------------------------------------------------------------------------------
---------------------------FILL IN SCRIPT HERE---------------------------------
-------------------------------------------------------------------------------}

procedure declarePlayers();
begin
setLength(players, 1);
with players[0] do
begin
loginName := '';
password := '';
isActive := true;
isMember := true;
end
currentPlayer := 0;
end;

{------------------------------------------------------------------------------
-------------------------STOP FILLING IN SCRIPT HERE---------------------------
-------------------------------------------------------------------------------}

procedure walkToCabbies();
var
pathToCabbies: TPointArray;
begin
if not isLoggedIn() then
exit;

pathToCabbies := [Point(215, 172), Point(203, 172), Point(189, 167), Point(173, 165), Point(165, 159), Point(154, 150), Point(140, 139), Point(140, 124), Point(133, 120), Point(126, 114), Point(119, 109), Point(104, 107)];

if SPS.walkPath(pathToCabbies) then
minimap.waitPlayerMoving()
else
writeln('Failed Walk to Cabbies...');
end;

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

procedure walkToBank();
var
pathToBank: TPointArray;
begin
if not isLoggedIn() then
exit;

pathToBank := [Point(104, 107), Point(119, 109), Point(126, 114), Point(133, 120), Point(140, 124), Point(140, 139), Point(154, 150), Point(165, 159), Point(173, 165), Point(189, 167), Point(203, 172), Point(215, 172)];

if SPS.walkPath(pathToBank) then
minimap.waitPlayerMoving()
else
writeln('Failed Walk to Bank...');
end;

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

procedure clickCabbies();
var
x, y: integer;
begin
if not isLoggedIn() then
exit;

mainscreen.findObject(x, y, 2602604, 19, colorSetting(2, 0.23, 0.88), mainscreen.playerPoint, 5, 5, 5, ['abbage'], MOUSE_LEFT);
wait(randomrange(2000,3500));
minimap.waitPlayerMoving();
end;

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

procedure bank();
begin
if bankScreen.open(BANK_CHEST_LUMBRIDGE) then
wait(randomrange(1500,2500))
else
begin
writeln('Did not open bank. We failed. Termination in progress.');
Terminatescript;
end;
end;

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

procedure depositLoot();
begin
if bankScreen.isOpen() then
begin
bankScreen.quickDeposit(QUICK_DEPOSIT_INVENTORY);
wait(randomRange(1000, 2000));
bankScreen.close();
end else
begin
writeLn('Couldn''t find the bank for some reason!');
Terminatescript;
end;
end;

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

procedure mainLoop();
begin

walkToBank;
bank;
depositLoot;
walkToCabbies;

repeat
clickCabbies;
until tabBackPack.isFull();

end;

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

begin
clearDebug();
smartEnableDrawing := true;
setupSRL();
declarePlayers();

SPS.setup('Lumby', RUNESCAPE_SURFACE);
SPSanyangle := false;

if not isLoggedIn() then
begin
players[currentPlayer].login();
exitTreasure();
minimap.setAngle(MM_DIRECTION_NORTH);
mainScreen.setAngle(MS_ANGLE_HIGH);
end;

repeat
mainLoop();
until false;
end.

If you run this, this will take your character from the bank, all the way to the cabbage patch, collect 'em cabbages and bank them.

Give it a shot!




5: Final Thoughts


Well, congratz on your cabbage collecting script!

My hopes are that you learned a bit from this tutorial and how a script should flow. As you can see, I started with the two SPS procedures at the top of my script. This is because I just wanted to get them out of the way.

I have a couple of things that I would love to remind you of for when you go and begin to write your own scripts:

- Always remember that a procedure/function number 1 cannot be called in procedure/function number 2 unless procedure/function 1 are above procedure/function 2.
- You should always try to have a nice and neat script if you want to have people read through it and give you advice. This is especially useful for when you apply for members.
- Even though this script does not have a break system or anti-ban system, it never hurts to add them yourself. Read through scripts to get a feel for how those work.
- Mainloops are not always needed, but they help keep things neat.
- The Include has a lot of built-in options for you to use. Do not ever hesitate to use them! They are there for a reason, and that reason is to make your life easier!

Anyways, I hope you enjoyed the tutorial, and most of all, I hope you learned from it!

If you have any questions, feel free to comment, PM, or add me on skype!

If you have anything you wish me to fix,, notice something is missing, or notice a problem with the tutorial, once again, let me know using any of those three listed options.


Anyways,

Happy Botting!

Clarity
06-10-2015, 03:40 AM
http://i.gyazo.com/3042e535ed6479a53c1b67cf4f9f73d7.png

Looks excellent. Seems like a tutorial I would've used back in the day. Some people do indeed learn better by reverse-engineering templates and skeletons!
Thanks for making this :)

StickToTheScript
06-10-2015, 03:47 AM
http://i.gyazo.com/3042e535ed6479a53c1b67cf4f9f73d7.png

Looks excellent. Seems like a tutorial I would've used back in the day. Some people do indeed learn better by reverse-engineering templates and skeletons!
Thanks for making this :)

It was my pleasure! I love writing things like this!

Raiden702
06-10-2015, 03:53 AM
Super pro sauce.

Ian
06-10-2015, 04:11 AM
http://i.imgur.com/wpA4rKc.jpg

You see the other bank chest? It's much closer than the one you're using. ;)

Good tutorial.

StickToTheScript
06-10-2015, 04:20 AM
You see the other bank chest? It's much closer than the one you're using. ;)

Good tutorial.

LOL. I know. My goal was to demonstrate walking to a point off of the screen.
But thanks! I enjoyed it.


Super pro sauce.

Lol. Never heard that one before.

Incurable
06-10-2015, 04:30 AM
Congrats on releasing a tutorial!

http://puu.sh/cgLx7/05864441d9.png

Your depositLoot procedure could be made even faster by using bankScreen.clickButton (http://docs.villavu.com/srl-6/bankscreen.html#trsbankscreen-clickbutton) as follows:


procedure depositLoot();
begin
if bankScreen.isOpen() then
begin
// Configure which preset to use in the setup
bankScreen.clickButton(PRESET_BUTTON)
// where PRESET_BUTTON is a user setup constant
end else
begin
writeLn('Couldn''t find the bank for some reason!');
Terminatescript;
end;
end;


It might be worth adding that to the tutorial to show how we can allow script users more customisation when using the script. For example, you could set whether to use quick deposit or a preset, and which preset to use.

Great tutorial mate. :)

StickToTheScript
06-10-2015, 05:54 AM
Congrats on releasing a tutorial!

http://puu.sh/cgLx7/05864441d9.png

Your depositLoot procedure could be made even faster by using bankScreen.clickButton (http://docs.villavu.com/srl-6/bankscreen.html#trsbankscreen-clickbutton) as follows:


procedure depositLoot();
begin
if bankScreen.isOpen() then
begin
// Configure which preset to use in the setup
bankScreen.clickButton(PRESET_BUTTON)
// where PRESET_BUTTON is a user setup constant
end else
begin
writeLn('Couldn''t find the bank for some reason!');
Terminatescript;
end;
end;


It might be worth adding that to the tutorial to show how we can allow script users more customisation when using the script. For example, you could set whether to use quick deposit or a preset, and which preset to use.

Great tutorial mate. :)

Added! Mentioned you and all! Thanks for the idea!

R3LAX
06-10-2015, 07:57 AM
Awesome tut for us noobs! Thanks very much.

srlMW
06-10-2015, 01:20 PM
Congratz on the tutorial! Always nice to have multiples because they all include different contents, which will benefit new learners greatly!:thumbsup:

StickToTheScript
06-10-2015, 02:30 PM
Awesome tut for us noobs! Thanks very much.

Always a pleasure to help!


Congratz on the tutorial! Always nice to have multiples because they all include different contents, which will benefit new learners greatly!:thumbsup:

Thanks! Always a pleasure helping in anyway I can.

Lipcot
06-10-2015, 05:54 PM
I had a script for this, now you're going to totally ruin my earnings! damn dude..

Great tutorial! :)

The Mayor
06-11-2015, 05:19 PM
Nice tutorial!

wedmarco
06-26-2015, 03:28 AM
A really nice, up to date guide! Thank you!

bucko
07-23-2015, 08:03 AM
Useful, thanks for this

Fisher
07-23-2015, 09:24 PM
Definitely going to be using this. I had already read through The Mayor's tutorial but couldn't seem to figure out SPS until I read this one. Once again, thank you for helping me release my first script!

imthecactus
08-14-2015, 05:38 AM
http://i.gyazo.com/3042e535ed6479a53c1b67cf4f9f73d7.png

Looks excellent. Seems like a tutorial I would've used back in the day. Some people do indeed learn better by reverse-engineering templates and skeletons!
Thanks for making this :)

I remember when I made an astral script. Yes I did modify and read some other users script to understand how it all fits together. And yes, it was pretty bad (My script.) The reverse engineering was such a help I wouldn't know where I'd be without it, although I remember having difficulties with colours because the island is dull.

karu
10-30-2015, 01:16 PM
Very nice tutorial, basically I could change the base code a bit and for example, make the player pick wheat instead of cabbages and bank in another place, right?

Shield
10-30-2015, 01:35 PM
Very nice tutorial, basically I could change the base code a bit and for example, make the player pick wheat instead of cabbages and bank in another place, right?

Yea. With the final script that StickToTheScript posted, you could use it to find anything and pick it up. You just need to switch the SPS map, the coords, the bank, and the colours.

karu
10-30-2015, 01:59 PM
Yea. With the final script that StickToTheScript posted, you could use it to find anything and pick it up. You just need to switch the SPS map, the coords, the bank, and the colours.

This is great, thanks for the info

qnzr3
11-12-2015, 05:01 PM
I have a couple of things that I would love to remind you of for when you go and begin to write your own scripts:

- Always remember that a procedure/function number 1 cannot be called in procedure/function number 2 unless procedure/function 1 are above procedure/function 2.

Note: That is not completely true, or at least not in the sense that is implied there. In Pascal and Delphi, the forward keyword allows you to declare that a function exists, and subsequently use it before actually implementing it.
This is absolutely necessary in any language that aspires to support mutual recursion.
Here's a dumb example of how the keyword may be used:


program new;

function mystery(s:integer):integer; forward;

procedure something(s:integer);
begin
writeln(mystery(s));
end;

function mystery(s: integer):integer;
begin
result:=s+5;
end;


begin
something(5);
end.

StickToTheScript
11-13-2015, 12:07 AM
Note: That is not completely true, or at least not in the sense that is implied there. In Pascal and Delphi, the forward keyword allows you to declare that a function exists, and subsequently use it before actually implementing it.
This is absolutely necessary in any language that aspires to support mutual recursion.
Here's a dumb example of how the keyword may be used:


program new;

function mystery(s:integer):integer; forward;

procedure something(s:integer);
begin
writeln(mystery(s));
end;

function mystery(s: integer):integer;
begin
result:=s+5;
end;


begin
something(5);
end.

This is correct, but this tutorial is for beginners. Therefore, my goal was to not confuse them by the use of forward, so I had left it out all together.