Advertisement
Guest User

runescape

a guest
Nov 23rd, 2014
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.18 KB | None | 0 0
  1. import math
  2. from pychart import *
  3.  
  4. theme.get_options()
  5.  
  6. class Graph(object):
  7.  
  8.     def __init__(self):
  9.         self.data1 = []
  10.         self.data2 = []
  11.         self.data3 = []
  12.         self.data4 = []
  13.         self.xaxis = axis.X(format="/a-60/hL%d", tic_interval = 20, label="Stuff")
  14.         self.yaxis = axis.Y(tic_interval = 20, label="Value")
  15.         self.ar = area.T(x_axis=self.xaxis, y_axis=self.yaxis, y_range=(0,None))
  16.         self.label = ["", "", "", ""]
  17.        
  18.     def getData1(self):
  19.         return self.data1
  20.     def getData2(self):
  21.         return self.data2
  22.     def getData3(self):
  23.         return self.data3
  24.     def getData4(self):
  25.         return self.data4
  26.     def addData1(self, dataX, dataY):
  27.         self.data1.append((dataX,dataY))
  28.     def addData2(self, dataX, dataY):
  29.         self.data2.append((dataX,dataY))
  30.     def addData3(self, dataX, dataY):
  31.         self.data3.append((dataX,dataY))
  32.     def addData4(self, dataX, dataY):
  33.         self.data4.append((dataX,dataY))
  34.     def setLineLabel(self,label,plotNo):
  35.         if plotNo < 4 and plotNo >= 0:
  36.             self.label[plotNo] = label
  37.        
  38.     def plotData(self):
  39.         # Filter repeated combat levels
  40.         prevVal=self.data1[0][0] # do for data1
  41.         removedVals = []
  42.         for i in range(0,len(self.data1)):
  43.             if prevVal==self.data1[i][0]:
  44.                 removedVals.append(self.data1[i])
  45.             prevVal=self.data1[i][0]
  46.         for i in range(0,len(removedVals)):
  47.             self.data1.remove(removedVals[i])
  48.         prevVal=self.data2[0][0] # do for data2
  49.         removedVals = []
  50.         for i in range(0,len(self.data2)):
  51.             if prevVal==self.data2[i][0]:
  52.                 removedVals.append(self.data2[i])
  53.             prevVal=self.data2[i][0]
  54.         for i in range(0,len(removedVals)):
  55.             self.data2.remove(removedVals[i])
  56.         prevVal=self.data3[0][0] # do for data3
  57.         removedVals = []
  58.         for i in range(0,len(self.data3)):
  59.             if prevVal==self.data3[i][0]:
  60.                 removedVals.append(self.data3[i])
  61.             prevVal=self.data3[i][0]
  62.         for i in range(0,len(removedVals)):
  63.             self.data3.remove(removedVals[i])
  64.         prevVal=self.data4[0][0] # do for data4
  65.         removedVals = []
  66.         for i in range(0,len(self.data4)):
  67.             if prevVal==self.data4[i][0]:
  68.                 removedVals.append(self.data4[i])
  69.             prevVal=self.data4[i][0]
  70.         for i in range(0,len(removedVals)):
  71.             self.data4.remove(removedVals[i])
  72.         # Finally plot the results on the graph
  73.         plot1 = line_plot.T(label=self.label[0], data=self.data1, ycol=1, tick_mark=tick_mark.default)
  74.         plot2 = line_plot.T(label=self.label[1], data=self.data2, ycol=1, tick_mark=tick_mark.default)
  75.         plot3 = line_plot.T(label=self.label[2], data=self.data3, ycol=1, tick_mark=tick_mark.default)
  76.         plot4 = line_plot.T(label=self.label[3], data=self.data4, ycol=1, tick_mark=tick_mark.default)
  77.         self.ar.add_plot(plot1,plot2,plot3)
  78.         self.ar.draw()
  79.  
  80. class Player(object):
  81.  
  82.     def __init__(self):
  83.         """
  84.         attack/strength/defence/hp/prayer levels are created for the player
  85.         we also assume a reasonable strength bonus for the stats
  86.         prayer boosts are initialised
  87.         """
  88.         self.attack = 60
  89.         self.strength = 60
  90.         self.defence = 1
  91.         self.hp = 10
  92.         self.prayer = 1
  93.         self.strengthBonus = 86
  94.         self.prayerMultiplier = 1.00
  95.  
  96.     def getAttack(self):
  97.         return self.attack
  98.     def getStrength(self):
  99.         return self.strength
  100.     def getDefence(self):
  101.         return self.defence
  102.     def getHp(self):
  103.         return self.hp
  104.     def getPrayer(self):
  105.         return self.prayer
  106.     def getCombatLevel(self):
  107.         """
  108.         we calculate the combat level with the given stats assuming the account
  109.         is melee based
  110.         """
  111.         base  = 0.25*(self.defence+self.hp+math.floor(self.prayer/2))
  112.         melee = 0.325*(self.attack+self.strength)
  113.         combat = math.floor(base+melee)
  114.         return combat
  115.     def getPrayerBoost(self):
  116.         """
  117.         find which prayer is the best we can use
  118.         and set our prayer multiplier to that
  119.         to be used in damage calculations
  120.         """
  121.         if self.prayer >= 31:
  122.             self.prayerMultiplier = 1.15
  123.         elif self.prayer >= 13:
  124.             self.prayerMultiplier = 1.10
  125.         elif self.prayer >= 4:
  126.             self.prayerMultiplier = 1.05
  127.         else:
  128.             self.prayerMultiplier = 1.00
  129.     def getMaxHit(self):
  130.         """
  131.         melee max hit is calculated and returned as a floating point (pre eoc damage used cos YOLO)
  132.         """
  133.         effectiveStrenth = self.strength + math.floor(self.strength*0.15) + 5 # Add super strength pot
  134.         self.getPrayerBoost()
  135.         effectiveStrenth = effectiveStrenth * self.prayerMultiplier + 8 + 3 # Add prayer boosts and Aggressive strength bonus
  136.         maxHit = math.floor((5 + effectiveStrenth + ((effectiveStrenth*self.strengthBonus)/64))/1)/10
  137.         return maxHit
  138.            
  139.     def setAttack(self, attack):
  140.         self.attack = attack
  141.     def setStrength(self, strength):
  142.         self.strength = strength
  143.     def setAutoStrength(self, prayer):
  144.         combatLevel = self.getCombatLevel() # save to be able to keep combat the same
  145.         self.prayer = prayer
  146.         while combatLevel != self.getCombatLevel():
  147.             self.strength -= 1
  148.             self.setAutoHp()
  149.     def setDefence(self, defence):
  150.         self.defence = defence
  151.     def setHp(self, hp):
  152.         self.hp = hp
  153.     def setAutoHp(self):
  154.         """
  155.         sets the minimum amount of hp xp given the combat stats
  156.         (this does not include quest rewards)
  157.         TODO: ADD QUEST REWARD XP TO FIX THIS
  158.         """
  159.         totalCombatXp = self.xpForLevel(self.attack) # add up how much melee xp in total
  160.         totalCombatXp += self.xpForLevel(self.strength)
  161.         totalCombatXp += self.xpForLevel(self.defence)
  162.         totalCombatXp *= 1.33 # hp gets less xp per damage
  163.         totalCombatXp += 1154 # hp starts at 10
  164.         for i in range(1,99):
  165.             if self.xpForLevel(i) > totalCombatXp:
  166.                 self.hp = i-1
  167.                 break
  168.     def setPrayer(self, prayer):
  169.         self.prayer = prayer
  170.     def setAll(self, attack, strength, defence, prayer):
  171.         """
  172.         faster/cleaner way to set all params
  173.         """
  174.         self.attack = attack
  175.         self.strength = strength
  176.         self.defence = defence
  177.         self.prayer = prayer
  178.        
  179.     def displayMaxHit(self):
  180.         print "Strength: " + str(self.strength) + " Hp: " + str(self.hp) + " Prayer: " + str(self.prayer)
  181.         print "Combat Level: " + str(self.getCombatLevel())
  182.         print "Max Hit: " + str(self.getMaxHit())
  183.     def plotResults(self):
  184.         if self.prayer == 1:
  185.             graph.addData1(self.getCombatLevel(),self.getMaxHit())
  186.         if self.prayer == 4:
  187.             graph.addData2(self.getCombatLevel(),self.getMaxHit())
  188.         if self.prayer == 13:
  189.             graph.addData3(self.getCombatLevel(),self.getMaxHit())
  190.         if self.prayer == 31:
  191.             graph.addData4(self.getCombatLevel(),self.getMaxHit())
  192.     def xpForLevel(self,level):
  193.         """
  194.         calculate how much xp you need for a given level from 1
  195.         """
  196.         total = 0
  197.         for i in range(1,level):
  198.             total += math.floor(i + 300 * math.pow(2, i / 7.0))
  199.         return math.floor(total/4)
  200.     # def calcCrossoverLevels(self):
  201.        
  202.  
  203. graph = Graph()
  204. graph.setLineLabel("1",1)
  205. graph.setLineLabel("4",2)
  206. graph.setLineLabel("13",3)
  207. graph.setLineLabel("31",4)
  208. player = Player() # initialise objects
  209.  
  210. for i in range(60,100):
  211.     player.setStrength(i)
  212.     player.setPrayer(1)
  213.     player.setAutoHp()
  214.     player.plotResults()
  215.     # player.displayMaxHit()
  216.     for i in [4,13,31]:
  217.         player.setAutoStrength(i)
  218.         player.plotResults()
  219.         # player.displayMaxHit()
  220. graph.plotData()
  221.  
  222. """
  223. CALC AT WHICH STRENGTH LEVELS IT IS BEST TO LEVEL UP PRAYER
  224. TO DO THIS I NEED
  225. A WAY TO CALC COMBAT LEVEL  [DONE]
  226. A WAY TO CALC MAX HIT       [DONE]
  227. ITERATE FOR EACH STRENGTH   [DONE]
  228. LEVEL PAST 60 UP TO 99 THE
  229. MAX HITS WITH/WITHOUT PRAYERS
  230. DISPLAY RESULTS NICELY      [DONE] (COULD BE IMPROVED)
  231. CALC CROSSOVER LEVELS       [TODO]
  232. """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement