Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import print_function
- from tkinter import *
- from itertools import combinations
- from itertools import chain
- class Item():
- def __init__ (self,name,power,flatPen,percentPen,attackSpeed,critChance,lifesteal,cdr,mana,health,basicAttackDamage,gold):
- self.name = name
- self.power = power
- self.flatPen = flatPen
- self.percentPen = percentPen
- self.attackSpeed = attackSpeed
- self.critChance = critChance
- self.lifesteal = lifesteal
- self.cdr = cdr
- self.mana = mana
- self.health = health
- self.basicAttackDamage = basicAttackDamage
- self.gold = gold
- exe = Item("The Executioner",40,0,0,0.2,0,0,0,0,0,0,2200)
- qins = Item("Qin's Sais",40,0,0,0.2,0,0,0,0,0,0,2600)
- asi = Item("Asi",25,15,0,0.25,0,0.15,0,0,0,0,2550)
- titansBane = Item("Titan's Bane",45,0,0.2,0,0,0,0,0,0,0,2550)
- beatstick = Item("Brawler's Beatstick",50,15,0,0,0,0,0,0,0,0,2350)
- jotunnsWrath = Item("Jotunn's Wrath",40,10,0,0,0,0,0.2,150,0,0,2200)
- crusher = Item("Crusher",40,15,0,0.1,0,0,0,0,0,0,2400)
- trans = Item("Transcendance",40,0,0,0.2,0,0,0.1,1050,0,0,2600)
- hydras = Item("Hydra's Lament",40,0,0.1,0,0,0.1,0,0,0,0,2150)
- heartseeker = Item("Heartseeker",65,0,0.1,0,0,0,0,200,0,0,2900)
- dominance = Item("Dominance",55,0,0.1,0,0,0,0,200,0,0,2500)
- deathbringer = Item("Deathbringer",50,0,0,0,0.3,0,0,0,0,0,2900)
- rage = Item("Rage",35,0,0,0,0.45,0,0,0,0,0,2500)
- soulEater = Item("Soul Eater",40,0,0.1,0,0,0.15,0.1,0,0,0,2100)
- devos = Item("Devourer's Gauntlet",70,0,0,0,0,0.29,0,0,0,0,2300)
- bloodforge = Item("Bloodforge",75,0,0,0,0,0.15,0,0,0,0,2750)
- frostbound = Item("Frostbound Hammer",35,0,0,0,0,0,0,0,250,0,2300)
- runeforge = Item("Runeforged Hammer",45,0,0,0,0,0,0,0,250,0,2400)
- sledge = Item("Sledge",40,0,0,0,0,0,0,150,250,0,2300)
- blackthorn = Item("Blackthorn Hammer",30,0,0,0,0,0,0.1,200,400,0,2300)
- runic = Item("Runic Shield",35,0,0,0,0,0,0,0,150,0,2150)
- ancile = Item("Ancile",40,0,0,0,0,0,0.1,0,0,0,2250)
- cadShield = Item("Caduceus Shield",25,0,0,0,0,0,0,0,100,0,2500)
- ichaival = Item("Ichaival",35,0,0,0.3,0,0,0,0,0,0,2450)
- silverbranch = Item("Silverbranch Bow",30,0,0.2,0.3,0,0,0,0,0,0,2400)
- atalantas = Item("Atalanta's Bow",30,0,0,0.2,0.2,0.1,0,0,0,0,2350)
- windDemon = Item("Wind Demon",25,0,0.1,0.25,0.2,0,0,0,0,0,2500)
- shadowsteel = Item("Shadowsteel Shuriken",40,0,0,0.2,0.2,0,0,0,0,0,2400)
- failnot = Item("Failnot",40,0,0.1,0.1,0.2,0,0.2,0,0,0,2650)
- obow = Item("Odysseus' Bow",0,0,0,0.3,0,0,0,0,0,0,2100)
- rangdas = Item("Rangda's Mask",70,0,0,0,0,0,0,0,0,0,2500)
- goldenBlade = Item("Golden Blade",35,0,0,0.2,0,0,0,0,0,0,2000)
- scs = Item("Stone Cutting Sword",50,0,0,0,0,0,0,0,0,0,2200)
- hastenedKatana = Item("Hastened Katana",25,0,0,0.15,0,0,0,0,0,0,2450)
- serrated = Item("Serrated Edge",30,0,0.2,0,0,0.1,0,0,0,0,2650)
- jotunnsVigor = Item("Jotunn's Vigor",40,10,0,0,0,0,0.2,150,0,0,2800)
- jotunnsFerocity = Item("Jotunn's Ferocity",40,10,0,0,0,0,0.2,150,0,0,2800)
- envenomedDeathbringer = Item("Envenomed Deathbringer",50,0,0,0,0.3,0,0,0,0,0,3500)
- maliciousDeathbringer = Item("Malicious Deathbringer",50,0,0,0,0.3,0,0,0,0,0,3500)
- bumbasSpear = Item("Bumba's Spear",70,0,0.1,0,0,0,0.1,0,0,0,2100)
- mhb = Item("Manikin's Hidden Blade",60,0,0,0,0,0,0,0,0,0,2100)
- empty = Item("Empty",0,0,0,0,0,0,0,0,0,0,0)
- physicalItems = [exe,qins,asi,titansBane,beatstick,jotunnsWrath,jotunnsVigor,jotunnsFerocity,crusher,trans,hydras,heartseeker,dominance,deathbringer,envenomedDeathbringer,maliciousDeathbringer,rage,soulEater,devos,bloodforge,frostbound,runeforge,sledge,blackthorn,runic,cadShield,ancile,ichaival,atalantas,silverbranch,obow,failnot,windDemon,shadowsteel,goldenBlade,scs,hastenedKatana,serrated,rangdas,empty]
- physicalStarters = [bumbasSpear,mhb,empty]
- physicalItemsNames = []
- for i in physicalItems:
- physicalItemsNames.append(i.name)
- physicalItemsNames.append(" ")
- physicalStarterNames = []
- for i in physicalStarters:
- physicalStarterNames.append(i.name)
- physicalStarterNames.append(" ")
- def CalculateDamage():
- physicalItems = [exe,qins,asi,titansBane,beatstick,jotunnsWrath,jotunnsVigor,jotunnsFerocity,crusher,trans,hydras,heartseeker,dominance,deathbringer,envenomedDeathbringer,maliciousDeathbringer,rage,soulEater,devos,bloodforge,frostbound,runeforge,sledge,blackthorn,runic,cadShield,ancile,ichaival,atalantas,silverbranch,obow,failnot,windDemon,shadowsteel,goldenBlade,scs,hastenedKatana,serrated,rangdas,empty]
- requiredItems = []
- if(starterVariable.get()!=" "):
- for i in physicalStarters:
- if i.name == starterVariable.get():
- requiredItems.append(i)
- if(requiredItems1Variable.get()!=" "):
- for i in physicalItems:
- if i.name == requiredItems1Variable.get():
- requiredItems.append(i)
- if i.name != "Empty":
- physicalItems.remove(i)
- if(requiredItems2Variable.get()!=" "):
- for i in physicalItems:
- if i.name == requiredItems2Variable.get():
- requiredItems.append(i)
- if i.name != "Empty":
- physicalItems.remove(i)
- if(requiredItems3Variable.get()!=" "):
- for i in physicalItems:
- if i.name == requiredItems3Variable.get():
- requiredItems.append(i)
- if i.name != "Empty":
- physicalItems.remove(i)
- if(requiredItems4Variable.get()!=" "):
- for i in physicalItems:
- if i.name == requiredItems4Variable.get():
- requiredItems.append(i)
- if i.name != "Empty":
- physicalItems.remove(i)
- if(requiredItems5Variable.get()!=" "):
- for i in physicalItems:
- if i.name == requiredItems5Variable.get():
- requiredItems.append(i)
- if i.name != "Empty":
- physicalItems.remove(i)
- allbuilds =combinations(physicalItems, 6 - len(requiredItems))
- buildSorterBuilds = ["blank","blank"]
- buildSorterDamage = [0,9999999999]
- for k in allbuilds:
- build = requiredItems + list(k)
- power = 0
- AS = 1
- health = 2000
- mana = 1000
- cdr = 0
- lifesteal = 0
- flatPen = 0
- percentPen = 0
- totalGold = 0
- globalMulti = 1
- transBool = False
- silverbranchBool = False
- crusherBool = False
- titansBanePen = 0
- heartseekerBool = False
- mhbBool = False
- katanasBool = True
- jotunns = 0
- deathbringers = 0
- for i in build:
- power = power + i.power
- health = health + i.health
- mana = mana + i.mana
- cdr = cdr + i.cdr
- lifesteal = lifesteal + i.lifesteal
- flatPen = flatPen + i.flatPen
- percentPen = percentPen + i.percentPen
- totalGold = totalGold + i.gold
- AS = 1 + i.attackSpeed
- if i.name == "Transcendance":
- transBool = True
- elif i.name == "Rangda's Mask" and rangdasPassiveVariable.get():
- globalMulti += 0.15
- elif i.name == "Runeforged Hammer" and runeforgePassiveVariable.get():
- globalMulti += 0.2
- elif i.name == "Silverbranch Bow":
- silverbranchBool = True
- elif i.name == "Crusher":
- crusherBool = True
- elif i.name == "Ichaival" and ichaivalPassiveVariable.get():
- power += 65
- elif i.name == "Titan's Bane" and titansBanePassiveVariable.get():
- titansBanePen = 0.2
- elif i.name == "Heartseeker":
- heartseekerBool = True
- elif i.name == "Manikin's Hidden Blade":
- mhbBool = True
- elif i.name == "Jotunn's Ferocity" and ferocityPassiveVariable.get():
- globalMulti += 0.2
- elif katanasEnabledVariable.get() == False:
- if i.name == "Golden Blade" or i.name == "Stone Cutting Sword" or i.name == "Hastened Katana" or i.name == "Serrated Edge":
- katanasBool = False
- if i.name == "Jotunn's Wrath" or i.name == "Jotunn's Ferocity" or i.name == "Jotunn's Vigor":
- jotunns += 1
- if i.name == "Deathbringer" or i.name == "Envenomed Deathbringer" or i.name == "Malicious Deathbringer":
- deathbringers += 1
- if percentPen > 0.4:
- percentPen = 0.4
- if flatPen > 50:
- flatPen = 50
- if cdr > 0.4:
- cdr = 0.4
- if lifesteal > 1:
- lifesteal = 1
- if lifesteal >= float(minimumLifeStealEntry.get()) and cdr >=float(minimumCDREntry.get()) and katanasBool and jotunns <= 1 and deathbringers <= 1:
- if transBool:
- power = power + (mana * 0.03)
- if AS > 2.5 and silverbranchBool:
- power = power + (AS - 2.5) / 0.01
- target1Damage = (float(baseAbilityDamageEntry.get()) + ((power) * (float(powerScalingEntry.get()))))*min((100/(100+(((float(target1ProtsEntry.get())))*(1-(percentPen + titansBanePen)))-flatPen)),1)
- target2Damage = (float(baseAbilityDamageEntry.get()) + ((power) * (float(powerScalingEntry.get()))))*min((100/(100+(((float(target2ProtsEntry.get())))*(1-(percentPen + titansBanePen)))-flatPen)),1)
- if crusherBool:
- target1Damage += (20 + ((power) * (0.15)))*min((100/(100+(((float(target1ProtsEntry.get())))*(1-(percentPen)))-flatPen)),1)
- target2Damage += (20 + ((power) * (0.15)))*min((100/(100+(((float(target2ProtsEntry.get())))*(1-(percentPen)))-flatPen)),1)
- if heartseekerBool:
- if power < 200:
- heartseekerPercent = 3
- elif power > 400:
- heartseekerPercent = 6
- else:
- heartseekerPercent = (3/200) * power
- target1Damage = target1Damage + ((float(target1HealthEntry.get())*(heartseekerPercent/100)) * min((100/(100+(((float(target1ProtsEntry.get())))*(1-percentPen)-flatPen))),1))
- target2Damage = target2Damage + ((float(target2HealthEntry.get())*(heartseekerPercent/100)) * min((100/(100+(((float(target2ProtsEntry.get())))*(1-percentPen)-flatPen))),1))
- if mhbBool:
- target1Damage = target1Damage + ((float(target1HealthEntry.get())*(0.2)) * min((100/(100+(((float(target1ProtsEntry.get())))*(1-percentPen)-flatPen))),1))
- target2Damage = target2Damage + ((float(target2HealthEntry.get())*(0.2)) * min((100/(100+(((float(target2ProtsEntry.get())))*(1-percentPen)-flatPen))),1))
- target1Damage *= globalMulti
- target2Damage *= globalMulti
- if target1Damage >= float(minimumTarget1DamageEntry.get()) and target2Damage >= float(minimumTarget2DamageEntry.get()):
- if target1SortVariable.get():
- string = ""
- for i in build:
- string = string + i.name + ", "
- string = string + "\nTarget 1 Damage: " + str(round(target1Damage,2)) + " Target 2 Damage: " + str(round(target2Damage,2))+"\n"
- if len(buildSorterBuilds) == 2:
- buildSorterBuilds.insert(1,string)
- buildSorterDamage.insert(1,target1Damage)
- else:
- i = round(len(buildSorterBuilds)/2) - 1
- loop = True
- while(loop):
- if(target1Damage < buildSorterDamage[i-1]):
- i -= 1
- elif(target1Damage > buildSorterDamage[i]):
- i += 1
- else:
- loop = False
- buildSorterBuilds.insert(i,string)
- buildSorterDamage.insert(i,target1Damage)
- if len(buildSorterBuilds) > float(buildLimitForSorterEntry.get()) + 2:
- del buildSorterBuilds[1]
- del buildSorterDamage[1]
- elif target2SortVariable.get():
- string = ""
- for i in build:
- string = string + i.name + ", "
- string = string + "\nTarget 1 Damage: " + str(round(target1Damage,2)) + " Target 2 Damage: " + str(round(target2Damage,2))+"\n"
- if len(buildSorterBuilds) == 2:
- buildSorterBuilds.insert(1,string)
- buildSorterDamage.insert(1,target2Damage)
- else:
- i = round(len(buildSorterBuilds)/2) - 1
- loop = True
- while(loop):
- if(target2Damage < buildSorterDamage[i-1]):
- i -= 1
- elif(target2Damage > buildSorterDamage[i]):
- i += 1
- else:
- loop = False
- buildSorterBuilds.insert(i,string)
- buildSorterDamage.insert(i,target2Damage)
- if len(buildSorterBuilds) > float(buildLimitForSorterEntry.get()) + 2:
- del buildSorterBuilds[1]
- del buildSorterDamage[1]
- else:
- for i in build:
- print(i.name, end = ", ")
- print("\nTarget 1 Damage:" , round(target1Damage,2) , " Target 2 Damage:" , round(target2Damage,2),"\n")
- if target1SortVariable.get() or target2SortVariable.get():
- del buildSorterBuilds[0]
- del buildSorterBuilds[-1]
- for i in buildSorterBuilds:
- print(i)
- print("-------------------------------------------------------")
- def min(x, y):
- if x<y:
- return x
- return y
- ############################################################################################
- root = Tk()
- root.title("Generic Ability Damage")
- button = Button(root, text="Run Program", padx=25, command = CalculateDamage)
- button.grid(row = 0, column = 0)
- baseAbilityDamageLabel = Label(root,text="Base Ability Damage:")
- baseAbilityDamageLabel.grid(row = 1, column = 0)
- baseAbilityDamageEntry = Entry(root, width=5)
- baseAbilityDamageEntry.grid(row = 1, column = 1)
- baseAbilityDamageEntry.insert(0,"0")
- emptyLabel1 = Label(root,text=" ")
- emptyLabel1.grid(row = 1, column = 2)
- powerScalingLabel = Label(root,text="Power Scaling:")
- powerScalingLabel.grid(row = 1, column = 3)
- powerScalingEntry = Entry(root, width=5)
- powerScalingEntry.grid(row = 1, column = 4)
- powerScalingEntry.insert(0,"0")
- itemsLabel = Label(root,text="Required Items:")
- itemsLabel.grid(row = 2, column = 0)
- requiredItems1Variable = StringVar()
- requiredItems1Variable.set(" ")
- requiredItems1 = OptionMenu(root, requiredItems1Variable, *physicalItemsNames)
- requiredItems1.grid(row=2, column=1)
- requiredItems2Variable = StringVar()
- requiredItems2Variable.set(" ")
- requiredItems2 = OptionMenu(root, requiredItems2Variable, *physicalItemsNames)
- requiredItems2.grid(row=2, column=2)
- requiredItems3Variable = StringVar()
- requiredItems3Variable.set(" ")
- requiredItems3 = OptionMenu(root, requiredItems3Variable, *physicalItemsNames)
- requiredItems3.grid(row=2, column=3)
- requiredItems4Variable = StringVar()
- requiredItems4Variable.set(" ")
- requiredItems4 = OptionMenu(root, requiredItems4Variable, *physicalItemsNames)
- requiredItems4.grid(row=2, column=4)
- requiredItems5Variable = StringVar()
- requiredItems5Variable.set(" ")
- requiredItems5 = OptionMenu(root, requiredItems5Variable, *physicalItemsNames)
- requiredItems5.grid(row=2, column=5)
- starterLabel = Label(root,text="Starter Item:")
- starterLabel.grid(row = 3, column = 0)
- starterVariable = StringVar()
- starterVariable.set(" ")
- starter = OptionMenu(root, starterVariable, *physicalStarterNames)
- starter.grid(row=3, column=1)
- target1ProtsLabel = Label(root,text="Target 1 Protections:")
- target1ProtsLabel.grid(row = 4, column = 0)
- target1ProtsEntry = Entry(root, width=5)
- target1ProtsEntry.grid(row = 4, column = 1)
- target1ProtsEntry.insert(0,"60")
- emptyLabel2 = Label(root,text=" ")
- emptyLabel2.grid(row = 4, column = 2)
- target1HealthLabel = Label(root,text="Target 1 Health:")
- target1HealthLabel.grid(row = 4, column = 3)
- target1HealthEntry = Entry(root, width=5)
- target1HealthEntry.grid(row = 4, column = 4)
- target1HealthEntry.insert(0,"2000")
- target2ProtsLabel = Label(root,text="Target 2 Protections:")
- target2ProtsLabel.grid(row = 5, column = 0)
- target2ProtsEntry = Entry(root, width=5)
- target2ProtsEntry.grid(row = 5, column = 1)
- target2ProtsEntry.insert(0,"200")
- emptyLabel3 = Label(root,text=" ")
- emptyLabel3.grid(row = 5, column = 2)
- target2HealthLabel = Label(root,text="Target 2 Health:")
- target2HealthLabel.grid(row = 5, column = 3)
- target2HealthEntry = Entry(root, width=5)
- target2HealthEntry.grid(row = 5, column = 4)
- target2HealthEntry.insert(0,"3000")
- minimumTarget1DamageLabel = Label(root,text="Minimum Target 1 Damage:")
- minimumTarget1DamageLabel.grid(row = 6, column = 0)
- minimumTarget1DamageEntry = Entry(root, width=5)
- minimumTarget1DamageEntry.grid(row = 6, column = 1)
- minimumTarget1DamageEntry.insert(0,"0")
- emptyLabel4 = Label(root,text=" ")
- emptyLabel4.grid(row = 6, column = 2)
- minimumTarget2DamageLabel = Label(root,text="Minimum Target 2 Damage:")
- minimumTarget2DamageLabel.grid(row = 6, column = 3)
- minimumTarget2DamageEntry = Entry(root, width=5)
- minimumTarget2DamageEntry.grid(row = 6, column = 4)
- minimumTarget2DamageEntry.insert(0,"0")
- minimumCDRLabel = Label(root,text="Minimum Cooldown Reduction:")
- minimumCDRLabel.grid(row = 7, column = 0)
- minimumCDREntry = Entry(root, width=5)
- minimumCDREntry.grid(row = 7, column = 1)
- minimumCDREntry.insert(0,"0")
- emptyLabel5 = Label(root,text=" ")
- emptyLabel5.grid(row = 7, column = 2)
- minimumLifeStealLabel = Label(root,text="Minimum Lifesteal:")
- minimumLifeStealLabel.grid(row = 7, column = 3)
- minimumLifeStealEntry = Entry(root, width=5)
- minimumLifeStealEntry.grid(row = 7, column = 4)
- minimumLifeStealEntry.insert(0,"0")
- disablePassivesLabel = Label(root,text="Enable/Disable Item Passives:")
- disablePassivesLabel.grid(row = 8, column = 0)
- rangdasPassiveVariable = BooleanVar()
- rangdasPassiveVariable.set(False)
- rangdasPassiveCheckBox = Checkbutton(root, text="Rangda's Mask", variable = rangdasPassiveVariable)
- rangdasPassiveCheckBox.grid(row = 8, column = 1)
- runeforgePassiveVariable = BooleanVar()
- runeforgePassiveVariable.set(False)
- runeforgePassiveCheckBox = Checkbutton(root, text="Runeforged Hammer", variable = runeforgePassiveVariable)
- runeforgePassiveCheckBox.grid(row = 8, column = 2)
- ichaivalPassiveVariable = BooleanVar()
- ichaivalPassiveVariable.set(False)
- ichaivalPassiveCheckBox = Checkbutton(root, text="Ichaival", variable = ichaivalPassiveVariable)
- ichaivalPassiveCheckBox.grid(row = 8, column = 3)
- titansBanePassiveVariable = BooleanVar()
- titansBanePassiveVariable.set(True)
- titansBanePassiveCheckBox = Checkbutton(root, text="Titan's Bane", variable = titansBanePassiveVariable)
- titansBanePassiveCheckBox.grid(row = 8, column = 4)
- ferocityPassiveVariable = BooleanVar()
- ferocityPassiveVariable.set(False)
- ferocityPassiveCheckBox = Checkbutton(root, text="Jotunn's Ferocity", variable = ferocityPassiveVariable)
- ferocityPassiveCheckBox.grid(row = 8, column = 5)
- katanasEnabledVariable = BooleanVar()
- katanasEnabledVariable.set(False)
- katanasEnabledCheckBox = Checkbutton(root, text="Katana Tree", variable = katanasEnabledVariable)
- katanasEnabledCheckBox.grid(row = 8, column = 6)
- target1SortVariable = BooleanVar()
- target1SortVariable.set(False)
- target1SortCheckBox = Checkbutton(root, text="Sort Builds By Damage to Target 1", variable = target1SortVariable)
- target1SortCheckBox.grid(row = 9, column = 1)
- target2SortVariable = BooleanVar()
- target2SortVariable.set(False)
- target2SortCheckBox = Checkbutton(root, text="Sort Builds By Damage to Target 2", variable = target2SortVariable)
- target2SortCheckBox.grid(row = 9, column = 3)
- buildLimitForSorterLabel = Label(root,text="Number of Builds Displayed When Sorting:")
- buildLimitForSorterLabel.grid(row = 10, column = 0)
- buildLimitForSorterEntry = Entry(root, width=5)
- buildLimitForSorterEntry.grid(row = 10, column = 1)
- buildLimitForSorterEntry.insert(0,"20")
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment