• Dear Guest,

    You're browsing our forum as a Guest meaning you can only see a portion of the forum in read-only mode.
    To view all forum nodes and be able to create threads/posts please register or log-in with your existing account.

    TwinStar team

Honor to Rank Conversion

nimeralos

Authorized
Joined
Aug 26, 2014
Location
Moscow
In Vanilla, you should earn Rank Points to rank. Rank Points depend on your standing in the list of your faction PvPers (sorted by honor). The list updates every week, you get your week Rank Points, then your rank decays for maximum of 20% of your total Rank Points.

Q: TL;DR, how many honor do I need to rank up?
A: It depends on the server PvP situation.
Aaaand the server PvP situation is now visualised, thanks to the magnificent HonorToRank tool!

This is how I got my R3 :)
2QfgVZB.png


General plots for K1 and K2 for the previous week:
9aoMWoN.png

hl8Uvak.png
Source code:
Code:
# -*- coding: cp1251 -*-
from requests import session
import re
from datetime import date
import matplotlib.pyplot as plt
from datetime import date
from datetime import timedelta
import easygui
import FileDialog
###########################################
#Rewritten function from wowwiki
def GenerateFunction (NR, CPs):
   # Variables:
   #   NR    = total number of ranked players ont he server/side
   #   CPs   = array of the CP scores for each of the ranked 
   #           players, indexed by their WS
   #   FX   = the X (CP) values of the 15 function control points
   #   FY   = the Y (RP) values of the 15 function control points
   # 
   # Before any scoring can be done, we need to determine 
   # the parameters of the piecewise-linear function for 
   # this week. This is done with the following function call:
   #
   #(FX, FY) = GenerateFunction(NR, CPs);


   # initialize the breakpoint values
   BRK = {}
   FX = [None]*15
   FY = [None]*15
   
   BRK[14] = 0.003
   BRK[13] = 0.008
   BRK[12] = 0.020
   BRK[11] = 0.035
   BRK[10] = 0.060
   BRK[ 9] = 0.100       
   BRK[ 8] = 0.159       
   BRK[ 7] = 0.228       
   BRK[ 6] = 0.327       
   BRK[ 5] = 0.436       
   BRK[ 4] = 0.566      
   BRK[ 3] = 0.697      
   BRK[ 2] = 0.845
   #
   # get the WS scores at the top of each break point
   for i in xrange (2,15):
       BRK [i] = round( BRK [i] * NR )
   #
   # set the high point
   FX[14] = CPs[0][1];   # top scorer
   FY[14] = 13000;   # ... gets 13000 RP
   #
   # set the low point
   FX[ 0] = 0;
   FY[ 0] = 0;
   #
   # the Y values for each breakpoint are fixed
   FY[ 1] = 400;
   for i in xrange (2,15):
      FY[i] = (i-1) * 1000
   #
   # the X values for each breakpoint are found from the CP scores
   # of the players around that point in the WS scores
   #print (BRK, FY, FX)
   for i in xrange (1,14):
      temp1 = [hon for st, hon in CPs if st >= BRK[i+1]]
      temp2 = [hon for st, hon in CPs if st < BRK[i+1]]
      if len (temp2) == 0 or len (temp1) == 0: #not enough PvPers to hit the breakpoint or lack of information
         continue
      #print (temp1, i)
      #print (temp2, i)
      FX[i] = (temp1 [0] + temp2 [-1])/2
      #FX[i] ={ CPs[ BRK[i] ] + CPs[ BRK[i]+1 ] }/ 2
   # 
   # function is complete, return the arrays
   return [FX, FY]
###########################################
#K1 or K2?
realm = easygui.buttonbox('Choose your realm.', 'Honor to rank convertor', ('Kronos I', 'Kronos II', 'Rebirth'))
if realm == 'Kronos I':
   realmurl = 'KRO'
if realm == 'Kronos II':
   realmurl = 'KR2'
if realm == 'Rebirth':
   realmurl = 'REB'


###########
#Get the raw info from the site
with session() as s:
    nowcharpos = 0
    raw = ''
    prevurl = 'http://realmplayers.com/PVPList.aspx?section=standings&realm='+realmurl+'&page=0'
    for p in xrange (1,10000):#the last possible page is 10000, but actually there're just several of them
        rawpage = s.get('http://realmplayers.com/PVPList.aspx?section=standings&realm='+realmurl+'&page='+str(p))
        if rawpage.url == prevurl: #table ends
            break    
        prevurl = rawpage.url
        raw = raw + rawpage.text


###########
#Get the separate pieces of html code corresponding to characters
tables = re.split ('characters-table', raw)#zero 'table' is html code before actual tables
htables = atables = ''
for i in xrange (1, len(tables), 2):#Horde tables are #1, 3, 5...
    htables = htables + tables [i]
for i in xrange (2, len(tables), 2):#Alliance tables are #2, 4, 6...
    atables = atables + tables [i]


hchars = re.split ('horde_row', htables) #everything before the first 'horde_row' occurence is of no interest, but we ignore this fact
achars = re.split ('alliance_row', atables)
for i in xrange (1, len (hchars)):
   hchars[i] = hchars[i][:1000] #a char html entry should not be too long - else it contains too much html trash which may be misinterpreted
for i in xrange (1, len (achars)):
   achars[i] = achars[i][:1000] #a typical char entry contains around 550 symbols, so 1000 is more than enough


###########
#Forming the list with standing-honor entries
hCPs = []
aCPs = []
for i, now in enumerate (hchars):
    nums = re.findall (r'\d+', now)
    if len (nums) == 0:#piece of html code not from the Horde or Alliance tables
        continue
    #print (nums) #so we see that standing is the first number in the row
    standing = int (nums [0])
    honorraw = re.findall (r'\d+k', now) #to determine where honor is, it's more convenient to search for number followed by 'k'
    if not honorraw:
        honor = 500 #when there's less than 1k, we assume that's 500
    else:
        honor = int (honorraw [0][:-1]) * 1000
    hCPs.append ([standing, honor])
    if i == len (hchars) - 1: #if it's the last ranked character
        hNR = standing #then the total number of Horde PvPers equals his/her standing


for i, now in enumerate (achars): #copypasting for the Alliance
    nums = re.findall (r'\d+', now)
    if len (nums) == 0:#piece of html code not from the Horde or Alliance tables
        continue
    #print (nums) #so we see that standing is the first number in the row
    standing = int (nums [0])
    honorraw = re.findall (r'\d+k', now) #to determine where honor is, it's more convenient to search for number followed by 'k'
    if not honorraw:
        honor = 500 #when there's less than 1k, we assume that's 500
    else:
        honor = int (honorraw [0][:-1]) * 1000
    aCPs.append ([standing, honor])
    if i == len (achars) - 1: #if it's the last ranked character
        aNR = standing #then the total number of Alliance PvPers equals his/her standing


###########
htemp = GenerateFunction (hNR, hCPs)
atemp = GenerateFunction (aNR, aCPs)
#Now we have the X and Y points for the current week's honor->RP function
#So let's plot


today = date.today()
offset = (today.weekday() - 2) % 7
last_wednesday = today - timedelta(days=offset)
#nonhardcore = plt.figure (1) #freezes for me
plt.plot (htemp[0][0:8], htemp[1][0:8], marker='o', linestyle='--', color='red', label = 'Horde')
plt.plot (atemp[0][0:8], atemp[1][0:8], marker='o', linestyle='--', color='blue', label = 'Alliance')
plt.xlabel('Honor earned')
plt.ylabel('Rank points gained')
#plt.xticks(list(plt.xticks()[0]) + [3000])
#plt.tick_params(axis='both', labelsize=10)
plt.title('Honor to RP conversion on '+realm+' as for '+str(last_wednesday)+' (non-hardcore part)')
plt.legend(bbox_to_anchor=(0.98, 0.2))
plt.grid(True)
plt.show()
##
#Sorry for the copypaste
#hardcore = plt.figure (2)
plt.plot (htemp[0][7:15], htemp[1][7:15], marker='o', linestyle='--', color='red', label = 'Horde')
plt.plot (atemp[0][7:15], atemp[1][7:15], marker='o', linestyle='--', color='blue', label = 'Alliance')
plt.xlabel('Honor earned')
plt.ylabel('Rank points gained')
plt.title('Honor to RP conversion on '+realm+' as for '+str(last_wednesday)+' (hardcore part)')
plt.legend(bbox_to_anchor=(0.98, 0.2))
plt.grid(True)
plt.show()
##
#overall = plt.figure (3)
plt.plot (htemp[0], htemp[1], marker='o', linestyle='--', color='red', label = 'Horde')
plt.plot (atemp[0], atemp[1], marker='o', linestyle='--', color='blue', label = 'Alliance')
#plt.xticks([10000, 50000, 100000, 150000, 200000, 250000, 300000])
plt.yticks(xrange(1000, 13500, 1000))
plt.xlabel('Honor earned')
plt.ylabel('Rank points gained')
plt.title('Honor to RP conversion on '+realm+' as for '+str(last_wednesday))
plt.legend(bbox_to_anchor=(0.98, 0.2))
plt.grid(True)
plt.show()
##
#raw_input ()


#No need for the function - just look at the graph
#def LinearFit (CP, @FX, @FY)
### Variables:
###   CP    = the given player's CP score for the week
###   @FX   = function params from above
###   @FY   = function params from above
###   RP    = the given player's RP earning for the week
###
### RP is found by a linear fit to one segment of the 
### generated function.
### 
##RP = LinearFit(CP, @FX, @FY);
##sub LinearFit (CP, @FX, @FY) {
##   #
##   # search the function for the two points that bound the given CP
##   i = 15;
##   while ((i>0) and (FX[i-1] > CP)) {
##      i--;
##   }
##   # 
##   # we now have i such that FX[i] > CP >= FX[i-1]
##   # so interpolate
##   RP = (FY[i] - FY[i-1]) * (CP - FX[i-1]) / (FX[i] - FX[i-1]) + FY[i-1];
##   #
##   # that's all there is to it
##   return(RP);
Download it (compiler setup included).
Download the program which will provide you with the similar plots every week!

Too lazy to add a "Donate" button. Well, at least vote for sticky!

P.S.
The situation clearly depends on the age of a server - on K2 we have less "serious" PvP and more "occasional" PvP, so it's easier to get a few thousands of RP while leveling. For example, a casual ganker with 30 HKs will get like 100 RP, and a few dozens of casual gankers will "promote" the other PvPers.

The situation is clearly depends on the BG weekend. Only plots made after similar weekends are "safe to compare".
 
Last edited:
This week (WSG weekend) K2 almost became a mature server with healthy 60 PvP population. It's still possible to get a couple of thousands RP without PvPing too much there through.

F1gwX6y.png
s4VOTsF.png


Casual part zoomed (K2):
2K2noiW.png
 
Last edited:
Previous noBG weekend:
6krb64n.jpg

Aqxf6SI.jpg
And long-waited AV weekend (note the increase of honor value right after people got exalted on K2):
eINnYOf.jpg
F45aqRx.jpg
 
Damn, I thought K1 is tryhard but over 1 million for both factions is just insane.

Thanks for the work. Appreciate it!

Gesendet von meinem MI 4 mit Tapatalk
 
Nimeralos gives a good overall look at things here.
For the top rankers it is good to know how the system works in detail. Especially if they want to work together.

Your rank points is determined by:

1. If you are the one with most honor in your bracket, then you get the maximum amount of RP available to that bracket.
2. If you are not the one with most honor in your bracket, then your RP is calculated based on your amount of honor compared to the person with most honor in your bracket, aswell as the person with most honor in the bracket below you.
3. The size of each bracket determine how many players can get more than 12.000 RP, or how many players can get more than 11.000 and so on, so the size of your bracket also have a big impact on your rank points. The size of the brackets is determined by how many players of your faction gained a standing this week. In Alterac Valley weekends the amount of players in each bracket is bigger, but the formula is the same.



Example:

Bracket 1:
13000 Rankpoints = Standing 1 = 600.000 Honor
12730 Rankpoints = Standing 2 = 573.000 Honor

Bracket 2:
12000 Rankpoints = Standing 3 = 500.000 Honor
11970 Rankpoints = Standing 4 = 498.200 Honor
11400 Rankpoints = Standing 5 = 448.400 Honor

Bracket 3:
11000 Rankpoints = Standing 6 = 440.000 Honor



Explanation
________________________________________________________
The difference between standing 1 and standing 3 is 600.000 - 500.000 = 100.000 Honor.
Player with Standing 2 will be awarded RP between 12000-13000. The exact number is decided by calculating his honor in comparison to the gap between standing 1 and 3.
He has 573.000 Honor, so 73.000 honor is 73% of the 100.000 Honor difference.
The minimum amount of rankpoints he can get is 12.000, and then 73% of 1.000 RP is added, for a total of 12730 Rankpoints.

Standing 4 gets 11970 because he has 97% of the difference between Standing 3 (500.000) and Standing 6 (440.000).

As you can see you need to know where the brackets stop to calculate this, and you never know the size of your bracket which means you have to speculate.
But you do know the Honor of the various players (if you've been keeping an eye on them) - and so you can try more or less to prepare for several outcomes of bracket-sizes.
If you only prepare for one bracket-size, then all of your careful planning can backfire on you, see below.



Rankers Remorse
________________________________________________________
It's very common for top rankers to try to land very close in honor to each other in order to get most Rankpoints. But the problem comes when the size of the bracket does not end up as you hoped. For example in Alterac Valley weekend you might expect 4 people in the top bracket, and so you plan the honor of your team this way:


Standing 1 = 600.000 Honor
Standing 2 = 599.920 Honor
Standing 3 = 599.900 Honor
Standing 4 = 599.898 Honor
Standing 5 = 575.800 Honor


Then when the brackets are calculated you can end up with something like this:

Bracket 1:
13000 Rankpoints = Standing 1 = 600.000 Honor
12224 Rankpoints = Standing 2 = 599.920 Honor
12020 Rankpoints = Standing 3 = 599.900 Honor

Bracket 2:
12000 Rankpoints = Standing 4 = 599.898 Honor


Standing 3 only got 2% of his potential, and Standing 2 got 22%
Very bad update. What i would suggest instead would be:



Standing 1 = 600.000 Honor
Standing 2 = 599.980 Honor
Standing 3 = 590.000 Honor
Standing 4 = 575.000 Honor
Standing 5 = 574.980 Honor


Bracket 1:
13000 Rankpoints = Standing 1 = 600.000 Honor
12999 Rankpoints = Standing 2 = 599.980 Honor
12600 Rankpoints = Standing 3 = 590.000 Honor

Bracket 2:
12000 Rankpoints = Standing 4 = 575.000 Honor
 
Last edited:
Sorry for not updating the thread for a month.

Once again there's an AB weekend. Interesting how AV-mania on K2 haven't actually affected the plot too much. As for K1 - one can clearly see that a few hardcore Alliance rankers were indeed banned.
uuPOXVg.jpg

oKWQSSt.jpg
 
NoBG weekend (the date bugged since I ran the program on the early Wednesday, should be one week before):
QLj3ptz.jpg

Sy7D5Vc.jpg
AV weekend:
lxh1qIo.jpg

VRnPbZn.jpg
 
WSG weekend when ppl (even ppl on K2!) actually do WSG. There're still more people leveling and generally open-worlding on K2, that's why it's easier to get the first few thousands of RP. On the other hand - ranking premades are like two times nolifier there. I have two friends who're unable to get even R11-12, because they're not in one particular guild.
j6J0Duo.jpg

y46TEVv.jpg
 
AB weekend. It's interesting to note Horde R6s on K1 are real tryhards comparing to Alliance ones.
WlrDQMJ.jpg

ii9TEcH.jpg
 
I missed AV weekend, right? Well sorry, enjoy the new WSG weekend plots. It's interesting to note a significant honor cap reducation on K2, Alliance side. Either a few hardcore ppl got their ranks, or it has something to do with <Remedy> disband... Or both :)
zkNmgAA.jpg
dDvkPNX.jpg
 
Last edited:
Top Bottom