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.
This is how I got my R3
General plots for K1 and K2 for the previous week:
Source code:
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.
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
General plots for K1 and K2 for the previous week:
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);
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".
The situation is clearly depends on the BG weekend. Only plots made after similar weekends are "safe to compare".
Last edited: