SRL Archive - OSR Help

Making a breaking system?


elephant

2015-04-09 20:47:05

I would like to add breaking system and a system to switch accounts in my script, however I'm not really too sure where to begin with it. Can someone point me in the correct direction or give me an example of one :)?

3Garrett3

2015-04-09 21:00:46

Here's an example of the procedure I use. Includes player switching, sleeping, resting.


procedure Rester;
var
RL, RH, R: Integer;
begin
If Not isLoggedIn() or Failed Then Exit;

if players.getActive() > 1 then
begin
if (switchTime.getTime() >= players[currentPlayer].integers[SET_SWITCHEVERY]) then
begin
Writeln('[' + TehTime + '] NEXTPLAYER: Switching Players');
players.next(True);

switchTime.start();
RestTime.start();
SleepTime.start();

exitTreasure();
minimap.clickCompass();
mainScreen.setAngle(MS_ANGLE_HIGH);
//minimap.setAngle(MM_DIRECTION_NORTH);
FAttempts := 0;
clickPoll();
end;
end;

If Players[currentPlayer].booleans[SET_SLEEPING] Then
Begin
if players.getActive() = 1 then
If (sleepTime.getTime() >= Players[currentPlayer].integers[SET_SLEEPEVERY]) Then //Begin Sleeping
Begin

RL := Players[currentPlayer].integers[SET_SLEEPFOR] - Trunc((Players[currentPlayer].integers[SET_SLEEPFOR] / 100) * 10); //Sets the lower range of resting (10% less than given value)
RH := Players[currentPlayer].integers[SET_SLEEPFOR] + Round((Players[currentPlayer].integers[SET_SLEEPFOR] / 100) * 10); //Sets upper range of resting
R := RandomRange(RL, RH);

Writeln('[' + TehTime + '] SLEEP: Sleeping For : ' + IntToStr(Round(R / 1000 / 60)) + ' minutes');
paintStatus('Sleeping for ' + IntToStr(Round(R / 1000 / 60)) + ' minutes');

players[currentPlayer].logout();
Wait(R); //Rests for the total time

Inc(Sleeped);
IncEx(SleepT, R);

RestTime.start();
SleepTime.start();

players[currentPlayer].login();
exitTreasure();
closeAdWindow();
claimTicket();
clickPoll();
minimap.clickCompass();
mainScreen.setAngle(MS_ANGLE_HIGH);
FAttempts := 0;
End;
End; //End Sleeping

If Not Players[currentPlayer].booleans[SET_RESTING] Then Exit;

If Not (RestTime.getTime() >= Players[currentPlayer].integers[SET_RESTEVERY]) Then Exit; //If it isn't time to rest yet then exit

RL := Players[currentPlayer].integers[SET_RESTFOR] - Trunc((Players[currentPlayer].integers[SET_RESTFOR] / 100) * 20);
RH := Players[currentPlayer].integers[SET_RESTFOR] + Round((Players[currentPlayer].integers[SET_RESTFOR] / 100) * 20);
R := RandomRange(RL, RH);

Writeln('[' + TehTime + '] REST: Resting For : ' + IntToStr(Round(R / 1000 / 60)) + ' minutes');
paintStatus('Resting for ' + IntToStr(Round(R / 1000 / 60)) + ' minutes');

players[currentPlayer].logout();
Wait(R);

Inc(RAmount);
IncEx(RestT, R);
RestTime.start();

players[currentPlayer].login();
exitTreasure();
closeAdWindow();
claimTicket();
clickPoll();
minimap.clickCompass();
mainScreen.setAngle(MS_ANGLE_HIGH);
FAttempts := 0;

End;

NKN

2015-04-09 21:07:12

I wrote this awhile ago.

Never released it.



{
Breaking is a custom break handler library for use in scripts.


By NKN
}


type TBreaking = record
averageBreakTime,averageExtended, averageBreakAtTime, averageBreakAtLoads:integer;//holds the averages
BreakTime: integer; //How long to break for in seconds.
extendedBreakTime: integer; //How long to break for an extended break in minutes
useExtendedBreaks: boolean; //Enables use of automatic extended breaks.
randomPercent: extended; //At what percent should the BreakTime and BreakAtTime be randomized to. (100 average wait time with 10% random = 90 - 110 actual wait.)
timeExtended, time:integer; //Stores the time you switch at.
loads:integer; //Stores user loads
BreakAtTime: integer; //The ms amount the break triggers at
BreakAtLoads: integer; //User can also count for loads.
end;

var
breaking:TBreaking;


(*
TBreaking.setup
~~~~~

.. code-block:: pascal

procedure TBreaking.setup(averageTime, extendedTime, randomPerc, TimeToBreak, BreakLoads : integer; useExtended:boolean);

Sets up the custom breaking variable with specified options.

.. note::

- by NKN

Example:

.. code-block:: pascal

breaking.setup(600, 300, 10, 60, 0, true);

*)
procedure TBreaking.setup(averageTime, extendedTime, randomPerc, TimeTobreak, BreakLoads : integer; useExtended:boolean);
var
tmpRandom:integer;
begin
averageBreakTime := averageTime;
averageExtended := extendedTime;
averageBreakAtTime := TimeToBreak;
averageBreakAtLoads := BreakLoads;
if(randomPerc > 100) then
randomPerc = 100
else if(randomPerc < 0) then
randomperc = 0;
randomPercent := randomPerc / 100;
tmpRandom := Round(averageTime * randomPercent);
BreakTime := (averageTime + randomRange(-tmpRandom, tmpRandom)) * 1000;
tmpRandom := Round(extendedTime * randomPercent);
extendedBreakTime := (extendedTime + randomRange(-tmpRandom, tmpRandom)) * 1000 * 60;
useExtendedBreaks := useExtended;
tmpRandom := Round(TimeToBreak * randomPercent);
BreakAtTime := ((TimeToBreak + RandomRange(-tmpRandom, tmpRandom))*1000 * 60);
tmpRandom := Round(breakLoads * randomPercent);
BreakAtLoads := BreakLoads + RandomRange(-tmpRandom, tmpRandom);
time := GetSystemTime() + breakAtTime;
timeExtended := GetSystemTime() + RandomRange(21600000,36000000);
end;

(*
TBreaking.setup() overload;
~~~~~~~~~~~~~~~~~

.. code-block:: pascal

procedure TBreaking.setup(averageTime,randomPerc, breakTime, BreakLoads:integer); overload;

Sets up the custom breaking variable with specified options.

.. note::

- by NKN

Example:

.. code-block:: pascal

breaking.setup(600,10,120,0);
*)
procedure TBreaking.setup(averageTime,randomPerc, TimeToBreak, BreakLoads:integer); overload;
begin
Self.setup(averageTime, averageExtended, randomPerc, TimeToBreak, BreakLoads, useExtendedBreaks);
end;

(*
TBreaking.setup() overload;
~~~~~~~~~~~~~~~~~

.. code-block:: pascal

procedure TBreaking.setup(extendedTime, randomPerc:integer; useExtend:boolean); overload;

Sets up the custom breaking variable with specified options.

.. note::

- by NKN

Example:

.. code-block:: pascal

breaking.setup(300,10,true);
*)
procedure TBreaking.setup(extendedTime, randomPerc:integer; useExtend:boolean); overload;
begin
Self.setup(averageBreakTime, extendedTime, randomPerc, averageBreakAtTime, averageBreakAtLoads, useExtend);
end;

(*
TBreaking.setup() overload;
~~~~~~~~~~~~~~~~~

.. code-block:: pascal

procedure TBreaking.setup(breakTime, breakLoads:integer); overload;

Sets up the custom breaking variable with specified options.

.. note::

- by NKN

Example:

.. code-block:: pascal

breaking.setup(120, 0);
*)
procedure TBreaking.setup(breakTime, breakLoads:integer); overload;
begin
Self.setup(BreakTime, Round(RandomPercent*100), breakTime, averageBreakAtLoads);
end;

procedure TBreaking.reset();
begin
Self.setup(AverageBreakTime, averageExtended, Round(randomPercent*100), averageBreakAtTime, averageBreakAtLoads, useExtendedBreaks);
end;



(*
TBreaking.break()
~~~~~~~~~~~~~~~~~

.. code-block:: pascal

function TBreaking.break(var returnTime:integer):boolean;

Checks if you need to break, and if so, how long to wait

.. note::

- by NKN

Example:

.. code-block:: pascal

if(breaking.break(returnTime)) then
wait(returnTime);
*)

function TBreaking.break(var returnTime:integer; var extended:boolean):boolean;
var
tmpTime:integer;
begin
if((getSystemTime > timeExtended) and (useExtendedBreaks)) then
begin
result := true;
extended := true;
returnTime := extendedBreakTime;
Self.setup(averageBreakTime, averageExtended, Round(RandomPercent * 100), averageBreakAtTime, averageBreakAtLoads, useExtendedBreaks);
time := Time + Round(returnTime / 1000 / 60);
timeExtended = GetSystemTime() + RandomRange(21600000,36000000) + Round(extendedBreakTime / 1000 / 60);
end else if(loads > BreakAtLoads) then
begin
result := true;
returnTime := breakTime;
tmpTime := timeExtended;
Self.setup(averageBreakTime, averageExtended, Round(RandomPercent * 100), averageBreakAtTime, averageBreakAtLoads, useExtendedBreaks);
time := Time + Round(returnTime / 1000 / 60);
loads := 0;
timeExtended := tmpTime;
end else if(GetSystemTime > time) then
begin
result := true;
returnTime := breakTime;
tmpTime := timeExtended;
Self.setup(averageBreakTime, averageExtended, Round(RandomPercent * 100), averageBreakAtTime, averageBreakAtLoads, useExtendedBreaks);
time := Time + Round(returnTime / 1000 / 60);
timeExtended := tmpTime;
end;
end;



Used like:

procedure MainLoop;
var
breakWait:integer;
longBreak:boolean;
breakTimer:TTimeMarker;
begin
repeat
if (breaking.break(breakWait, longBreak)) then
begin
writeln('Waiting for ' + ToStr(MsToTime(breakWait, TIME_FORMAL)));
players[currentPlayer].logout();
breakTimer.start();
while(breakTimer.getTime < breakWait) do
begin
wait(RandomRange(45000,60000));
writeln('Waiting for ' + ToStr(MSToTime(breakWait - breakTimer.getTime, TIME_FORMAL)));
end;
if (longBreak) then
begin
//longBreak custom stuff here.
end
end;


until(false);
end;


elephant

2015-04-10 18:09:01

Thanks for the responses, I wrote a simple breaking system based around the idea. I was wondering if anyone could tell me if I am headed in the right direction before I add onto it. (sorry for using php tags, I could not get the simba tags to work) :(

[PHP]procedure breaking();
var
runTime : Integer; // How long to run for
breakTime : Integer; // How long to break for
randomRunTime : Integer; // How long to add onto run time to randomize it
randomBreakTime : Integer; // How long to add onto break time to randomize it
breaksTaken : Integer; // How many breaks have been taken
switchAccounts: Boolean; // Switch accounts instead of breaking
totalRunTime : Integer; // Total time to run
totalBreakTime : Integer;
begin

// If the breaking system is enabled
if (useBreakingSystem = true) then begin
// Setup breaking information
if (BreakTimeSetup = false) then begin
// ***quick time information***
// 14400 = 4 hours
// 10800 = 3 hours
// 7200 = 2 hours
// 3600 = 1 hour
// 2700 = 45 minutes
// 1800 = 30 minutes
// 900 = 15 minutes
runTime := 3600;
breakTime := 900;
randomRunTime := 1800;
randomBreakTime := 900;
breaksTaken := 1;
switchAccounts := false;

// Totals times it will run for and break for
totalRunTime := runTime + random(randomRunTime);
totalBreaktime := breakTime + random(randomBreakTime);
end;

if (round(GetTimeRunning) / BreaksTaken >= totalRunTime) then begin
ReflectPlayer.Logout;
sleep (totalBreakTime);
breaksTaken += 1;
totalRunTime := runTime + random(randomRunTime);
totalBreaktime := breakTime + random(randomBreakTime);
end;
end;
end; [/PHP]

bonsai

2015-04-10 18:34:21

From: elephant
Thanks for the responses, I wrote a simple breaking system based around the idea. I was wondering if anyone could tell me if I am headed in the right direction before I add onto it. (sorry for using php tags, I could not get the simba tags to work) :(

[PHP]procedure breaking();
var
runTime : Integer; // How long to run for
breakTime : Integer; // How long to break for
randomRunTime : Integer; // How long to add onto run time to randomize it
randomBreakTime : Integer; // How long to add onto break time to randomize it
breaksTaken : Integer; // How many breaks have been taken
switchAccounts: Boolean; // Switch accounts instead of breaking
totalRunTime : Integer; // Total time to run
totalBreakTime : Integer;
begin

// If the breaking system is enabled
if (useBreakingSystem = true) then begin
// Setup breaking information
if (BreakTimeSetup = false) then begin
// ***quick time information***
// 14400 = 4 hours
// 10800 = 3 hours
// 7200 = 2 hours
// 3600 = 1 hour
// 2700 = 45 minutes
// 1800 = 30 minutes
// 900 = 15 minutes
runTime := 3600;
breakTime := 900;
randomRunTime := 1800;
randomBreakTime := 900;
breaksTaken := 1;
switchAccounts := false;

// Totals times it will run for and break for
totalRunTime := runTime + random(randomRunTime);
totalBreaktime := breakTime + random(randomBreakTime);
end;

if (round(GetTimeRunning) / BreaksTaken >= totalRunTime) then begin
ReflectPlayer.Logout;
sleep (totalBreakTime);
breaksTaken += 1;
totalRunTime := runTime + random(randomRunTime);
totalBreaktime := breakTime + random(randomBreakTime);
end;
end;
end; [/PHP]


Good stuff.

One issue, if you make variables inside of your function, they will die and recreate every time you call it. If you need to hold them over time you make them global so they persist from call to call.

The other way of maintaining variables is to use class functions like the code NKN posted.

elephant

2015-04-10 21:57:10

From: bonsai
Good stuff.

One issue, if you make variables inside of your function, they will die and recreate every time you call it. If you need to hold them over time you make them global so they persist from call to call.

The other way of maintaining variables is to use class functions like the code NKN posted.


Ah, alright. Gonna swap some to globals to make code look nicer maybe. And thanks for letting me know, wasn't sure if I was doing it correct or just over complicating it :).

elephant

2015-04-13 12:46:18

I am currently getting a division by 0 error in my code. Not really sure why as I debug it and it should be dividing by 1. I really cannot figure out what is causing this, would anyone be able to find the error? I commented where the error is occurring can't quite figure it out.
[PHP]procedure breaking();
var
runTime : Integer; // How long to run for
breakTime : Integer; // How long to break for
randomRunTime : Integer; // How long to add onto run time to randomize it
randomBreakTime : Integer; // How long to add onto break time to randomize it
breaksTaken : Integer; // How many breaks have been taken
switchAccounts: Boolean; // Switch accounts instead of breaking
totalRunTime : Integer; // Total time to run
totalBreakTime : Integer;
begin
// If the breaking system is enabled
if (useBreakingSystem = true) then begin
// Setup breaking information
if (BreakTimeSetup = false) then begin
// ***quick time information***
// 14400 = 4 hours
// 10800 = 3 hours
// 7200 = 2 hours
// 3600 = 1 hour
// 2700 = 45 minutes
// 1800 = 30 minutes
// 900 = 15 minutes
runTime := 3600;
breakTime := 900;
randomRunTime := 1800;
randomBreakTime := 900;
breaksTaken := 1;
switchAccounts := false;

// Totals times it will run for and break for
totalRunTime := runTime + random(randomRunTime);
totalBreaktime := breakTime + random(randomBreakTime);
BreakTimeSetup := true;

writeln('setup breaking system!');
end;

// Error is appearing right here, it's telling me round(GetTimeRunning/1000/breaksTaken) is dividing by 0.
writeln(intToStr(breaksTaken)); // debugging out breaksTaken is says "1" which means it should be dividing by 1?
writeln(intToStr(round(GetTimeRunning/1000 / breaksTaken))); // error would be here
if (round(GetTimeRunning/1000) / breaksTaken >= totalRunTime) then begin // and here
ReflectPlayer.Logout;
sleep (totalBreakTime);
breaksTaken += 1;
totalRunTime := runTime + random(randomRunTime);
totalBreaktime := breakTime + random(randomBreakTime);
BreakTimeSetup := false;
end;
end;
end; [/PHP]

3Garrett3

2015-04-13 13:30:00

From: elephant
I am currently getting a division by 0 error in my code. Not really sure why as I debug it and it should be dividing by 1. I really cannot figure out what is causing this, would anyone be able to find the error? I commented where the error is occurring can't quite figure it out.
[PHP]procedure breaking();
var
runTime : Integer; // How long to run for
breakTime : Integer; // How long to break for
randomRunTime : Integer; // How long to add onto run time to randomize it
randomBreakTime : Integer; // How long to add onto break time to randomize it
breaksTaken : Integer; // How many breaks have been taken
switchAccounts: Boolean; // Switch accounts instead of breaking
totalRunTime : Integer; // Total time to run
totalBreakTime : Integer;
begin
// If the breaking system is enabled
if (useBreakingSystem = true) then begin
// Setup breaking information
if (BreakTimeSetup = false) then begin
// ***quick time information***
// 14400 = 4 hours
// 10800 = 3 hours
// 7200 = 2 hours
// 3600 = 1 hour
// 2700 = 45 minutes
// 1800 = 30 minutes
// 900 = 15 minutes
runTime := 3600;
breakTime := 900;
randomRunTime := 1800;
randomBreakTime := 900;
breaksTaken := 1;
switchAccounts := false;

// Totals times it will run for and break for
totalRunTime := runTime + random(randomRunTime);
totalBreaktime := breakTime + random(randomBreakTime);
BreakTimeSetup := true;

writeln('setup breaking system!');
end;

// Error is appearing right here, it's telling me round(GetTimeRunning/1000/breaksTaken) is dividing by 0.
writeln(intToStr(breaksTaken)); // debugging out breaksTaken is says "1" which means it should be dividing by 1?
writeln(intToStr(round(GetTimeRunning/1000 / breaksTaken))); // error would be here
if (round(GetTimeRunning/1000) / breaksTaken >= totalRunTime) then begin // and here
ReflectPlayer.Logout;
sleep (totalBreakTime);
breaksTaken += 1;
totalRunTime := runTime + random(randomRunTime);
totalBreaktime := breakTime + random(randomBreakTime);
BreakTimeSetup := false;
end;
end;
end; [/PHP]


I think….

useBreakingSystem is a constant right? That's good.
breakTimeSetup appears to be a global variable. That's fine.
breaksTaken is a local variable. It is default 0 each time you run "breaking();". This is causing problems.

If you're using the breaking system, then you enter a begin/end. Inside this, if you need to set up the time, you set breaksTaken to 1. If you didn't need to setup the time (ie the variable was set true before) then your breaksTaken will be 0, because it is a local variable and will not keep the same value when you leave the function. The simple solution would be to make breaksTaken a global variable and it will keep the value no matter what function is happening.

elephant

2015-04-13 15:44:59

From: 3Garrett3
I think….

useBreakingSystem is a constant right? That's good.
breakTimeSetup appears to be a global variable. That's fine.
breaksTaken is a local variable. It is default 0 each time you run "breaking();". This is causing problems.

If you're using the breaking system, then you enter a begin/end. Inside this, if you need to set up the time, you set breaksTaken to 1. If you didn't need to setup the time (ie the variable was set true before) then your breaksTaken will be 0, because it is a local variable and will not keep the same value when you leave the function. The simple solution would be to make breaksTaken a global variable and it will keep the value no matter what function is happening.


Thanks, that did the trick :)