Results 1 to 5 of 5

Thread: Progress Bar and Time to Level Functions

  1. #1
    Join Date
    Jan 2012
    Location
    Long Island, NY
    Posts
    413
    Mentioned
    5 Post(s)
    Quoted
    95 Post(s)

    Default Progress Bar and Time to Level Functions

    Hey guys, I wrote this code to get some extra informmation for a progress report for an OpenGL bot I'm writing and thought I would share this. It builds off another thread by BMWxi with some functions we posted. Feel free to use/modify as you wish.

    Quick Run Down:
    So this code only requires one real input and that is CurrentXP. This can be obtained any way you would like but one way would be to grab the current experience in the stats tab at startup via
    Simba Code:
    tabStats.getSkillInfo(SKILL_ATTACK, INFO_CURRENT_XP)
    or by reading the chars at the texture for the skill you want in OpenGL. You should then regularly update this variable by measuring your change in XP and just adding to the original value. Then the rest is just simple arithmetic. You can derive every other value based on your CurrentXP using these functions. It's pretty straight forward. The progress bar is just 20 components representing 5% of a total 100%, you can change the characters with BAR_ELEMENT, just remember to add equal spacing for BAR_SPACE. I hope this can be useful in people's scripts by showing more information in addition to the current progress reports.

    Functions:
    Simba Code:
    function getLevelFromXP(XP: Integer): Integer;
    function getXpFromLevel(Lvl : Integer) : Integer;
    function xpPercent(CurrentXP, NextLvlXP : Integer) : Integer;
    function timeToLevel(RemainingXP, HourlyXP : Integer) : Integer;
    function drawBar(CurrentXP, NextLvlXP : Integer) : String;
    CODE:
    Simba Code:
    program PercentageBar;
    {$I SRL-6/SRL.simba}

    const
      XP_ARRAY : array of Integer = [0, 83, 174, 276, 388, 512, 650, 801, 969, 1154,
       1358, 1584, 1833, 2107, 2411, 2746, 3115, 3523, 3973, 4470, 5018, 5624, 6291,
       7028, 7842, 8740, 9730, 10824, 12031, 13363, 14833, 16456, 18247, 20224,
       22406, 24815, 27473, 30408, 33648, 37224, 41171, 45529, 50339, 55649, 61512,
       67983, 75127, 83014, 91721, 101333, 111945, 123660, 136594, 150872, 166636,
       184040, 203254, 224466, 247886, 273742, 302288, 333804, 368599, 407015,
       449428, 496254, 547953, 605032, 668051, 737627, 814445, 899257, 992895,
       1096278, 1210421, 1336443, 1475581, 1629200, 1798808, 1986068, 2192818,
       2421087, 2673114, 2951373, 3258594, 3597792, 3972294, 4385776, 4842295,
       5346332, 5902831, 6517253, 7195629, 7944614, 8771558, 9684577, 10692629,
       11805606, 13034431, 200000000];
      BAR_ELEMENT = '#';
      BAR_SPACE = ' ';

    (*
    getLevelFromXP
    ~~~~~~~~

    .. code-block:: pascal

        function getLevelFromXP(XP: Integer): Integer;

    Takes 'XP' as Integer and outputs the corresponding level as Integer.

    .. note::

        - by BMWxi

    Example:

    .. code-block:: pascal

        writeLn('Mining Level: ' + ToStr(getLevelFromXP(MiningXP));

    *)

    function getLevelFromXP(XP: Integer): Integer;
    var
      i: Integer;
    begin
      for i:= 0 to (length(XP_ARRAY) - 1) do
      begin
        if (XP >= XP_ARRAY[i]) and (XP < XP_ARRAY[i + 1]) then
          result:= (i + 1);
        if result then
          break();
      end;
    end;

    (*
    getXpFromLevel
    ~~~~~~~~

    .. code-block:: pascal

        function getXpFromLevel(Lvl : Integer) : Integer;

    Takes 'Lvl' as Integer and outputs the corresponding base experience as Integer.

    .. note::

        - by Brotein, Zyt3x

    Example:

    .. code-block:: pascal

        writeLn('XP at lvl90 Mining: ' + intToStr(getXpFromLevel(90));

    *)

    function getXPfromLevel(Level : Integer) : Integer;
    var
      i : Integer;
    begin
      for i := 1 to Level - 1 do
        result += floor(i + 300 * pow(2, i/7));
      result := floor(result / 4);
    end;

    (*
    xpPercent
    ~~~~~~~~

    .. code-block:: pascal

        function xpPercent(CurrentXP, NextLvlXP : Integer) : Integer;

    Takes 'CurrentXP' and 'NextLvlXP' as Integer and outputs the corresponding
    Percentage as Integer, where CurrentXP is the current experience in the skill
    and NextLvlXP is the baseline experience needed to get to the next level.
    THIS IS NOT XP REMAINING BUT THE TOTAL XP NEEDED TO BE THE NEXT LEVEL.

    .. note::

        - by Brotein

    Example:

    .. code-block:: pascal

        writeLn('Current %ToLvl: ' + intToStr(xpPercent(CurrentXP, NextLvlXP);

    *)

    function xpPercent(CurrentXP, NextLvlXP : Integer) : Integer;
    var
      temp : Integer := getXpFromLevel(getLevelFromXp(CurrentXP));
    begin
      result := floor(((CurrentXP - temp) / (NextLvlXP - temp)) * 100);
    end;

    (*
    timeToLevel
    ~~~~~~~~

    .. code-block:: pascal

        function timeToLevel(RemainingXP, HourlyXP : Integer) : Integer;

    Takes 'RemainingXP' and 'HourlyXP' as Integer and outputs the time to level
    in milliseconds as Integer, where 'RemainingXP' is 'NextLevelXP' - 'CurrentXP'
    and 'HourlyXP' is the experience per hour rate.

    .. note::

        - by Brotein

    Example:

    .. code-block:: pascal

        writeLn('TTL: ' + intToStr(xpPercent(CurrentXP, NextLvlXP);

    *)

    function timeToLevel(RemainingXP, HourlyXP : Integer) : Integer;
    begin
      result := floor((RemainingXP / HourlyXP) * 3600000);
    end;

    (*
    drawBar
    ~~~~~~~~

    .. code-block:: pascal

        function drawBar(CurrentXP, NextLvlXP : Integer) : String;

    Takes 'CurrentXP' and 'NextLvlXP' as Integer and outputs a String progress bar
    that is a combination of a total of 20 BAR_ELEMENT or BAR_SPACE.  That means
    each component is representative of 5% of a total 100%, thus the magic numbers.

        OUTPUT EXAMPLE
        - [#################   ] 86% to Level: 10

    .. note::

        - by Brotein

    Example:

    .. code-block:: pascal

        writeLn(drawBar(CurrentXP, NextLvlXP));

    *)

    function drawBar(CurrentXP, NextLvlXP : Integer) : String;
    var
      s : String;
      i, temp : Integer;
    begin
      s := s + '[';
      temp := floor(xpPercent(CurrentXP, NextLvlXP) / 5);
      for i := 1 to temp do
        s := s + BAR_ELEMENT;
      for i := 1 to (20 - temp) do
        s := s + BAR_SPACE;
      s := s + ']';
      s := s + ' ' + intToStr(xpPercent(CurrentXP, NextLvlXP)) + '% to Level: '
        + intToStr(getLevelFromXP(CurrentXP) + 1);
      result := s;
    end;
    Example:
    Simba Code:
    procedure progressReport;
    var
      CurrentXP : Integer := 1143485;
      NextLvlXP : Integer := getXPFromLevel(getLevelFromXP(CurrentXP) + 1);
      HourlyXP : Integer := 50000;
    begin
      clearDebug();
      writeln('-------------------Progress Report-------------------');
      writeLn('Current XP: ' + intToStr(CurrentXP));
      writeln('Current Level: ' + intToStr(getLevelFromXP(CurrentXP)));
      writeln('XP to Next Level: ' + intToStr(getXpFromLevel(getLevelFromXp(CurrentXP) + 1) - CurrentXP));
      writeLn('XP/HR: ' + intToStr(HourlyXP));
      writeln('Time to Level: ' + msToTime(timeToLevel(NextLvlXP - CurrentXP, HourlyXP), TIME_SHORT));
      writeln(drawBar(currentXP, NextLvlXP));
    end;
    Output:
    Code:
    -------------------Progress Report-------------------
    Current XP: 1143485
    Current Level: 74
    XP to Next Level: 66936
    XP/HR: 50000
    Time to Level: 01h 20m 19s
    [########            ] 41% to Level: 75
    Last edited by Brotein; 04-30-2015 at 03:33 PM. Reason: Fixed bugs in code

  2. #2
    Join Date
    Jan 2007
    Posts
    8,876
    Mentioned
    123 Post(s)
    Quoted
    327 Post(s)

    Default

    Nice! Your current code for getLevelFromXP wont work when you have exactly as much xp as required to be that level (i.e you have exactly 83 xp).
    Change
    "if (XP > XP_ARRAY[i]) and (XP < XP_ARRAY[i + 1]) then" to
    "if (XP >= XP_ARRAY[i]) and (XP < XP_ARRAY[i + 1]) then" and it'll work

    You could also clean up getXPFromLevel (don't need that many variables):
    Code:
    function getXPfromLevel(Level : Integer) : Integer;
    var
      I : Integer;
    begin
      for I := 1 to Level-1 do
        result += floor(I + 300 * pow(2, I/7));
      result := floor(result / 4);
    end;

  3. #3
    Join Date
    Dec 2011
    Posts
    2,147
    Mentioned
    221 Post(s)
    Quoted
    1068 Post(s)

  4. #4
    Join Date
    Jun 2012
    Posts
    4,867
    Mentioned
    74 Post(s)
    Quoted
    1663 Post(s)

    Default

    Nice Brotein! And thanks Zyt3x for the correction

  5. #5
    Join Date
    Jan 2012
    Location
    Long Island, NY
    Posts
    413
    Mentioned
    5 Post(s)
    Quoted
    95 Post(s)

    Default

    Quote Originally Posted by Zyt3x View Post
    Nice! Your current code for getLevelFromXP wont work when you have exactly as much xp as required to be that level (i.e you have exactly 83 xp).
    Change
    "if (XP > XP_ARRAY[i]) and (XP < XP_ARRAY[i + 1]) then" to
    "if (XP >= XP_ARRAY[i]) and (XP < XP_ARRAY[i + 1]) then" and it'll work

    You could also clean up getXPFromLevel (don't need that many variables):
    Code:
    function getXPfromLevel(Level : Integer) : Integer;
    var
      I : Integer;
    begin
      for I := 1 to Level-1 do
        result += floor(I + 300 * pow(2, I/7));
      result := floor(result / 4);
    end;
    Thanks for the fixes!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •