Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # PoE_ExpPenalty.py
- # by DajDwaZlote
- # v1.1
- ###
- import math
- import sys
- def GetSafeZone(PlayerLevel):
- return math.floor(3 + PlayerLevel / 16)
- def GetEffectiveDifference(PlayerLevel, MonsterLevel):
- SafeZone = GetSafeZone(PlayerLevel)
- return max(abs(PlayerLevel - MonsterLevel) - SafeZone, 0)
- def Get3_1_XP_Penalty(PlayerLevel):
- LevelToFactor = {
- 95 : 1.065,
- 96 : 1.115,
- 97 : 1.187,
- 98 : 1.2825,
- 99 : 1.4
- }
- return LevelToFactor.get(PlayerLevel, 1)
- def GetEffectiveMosterLevel(MonterLevel):
- return -0.03 * MonterLevel * MonterLevel + 5.17 * MonterLevel - 144.9
- def GetXPMultiplier(PlayerLevel, MonsterLevel):
- EffectiveDifference = GetEffectiveDifference(PlayerLevel, MonsterLevel)
- A = pow((PlayerLevel + 5) / (PlayerLevel + 5 + pow(EffectiveDifference, 2.5)), 1.5)
- if PlayerLevel < 95:
- return max(A, 0.01)
- else:
- B = 1 / (1 + 0.1 * (PlayerLevel - 94))
- C = 1 / Get3_1_XP_Penalty(PlayerLevel)
- return max(A * B * C, 0.01)
- def GetEffectiveXPMultiplier(PlayerLevel, MonsterLevel):
- EffectiveMosterLevel = GetEffectiveMosterLevel(MonsterLevel) if MonsterLevel >= 70 else MonsterLevel
- return GetXPMultiplier(PlayerLevel, EffectiveMosterLevel)
- def GenTable(MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel):
- for PlayerLevel in range(MinPlayerLevel, MaxPlayerLevel + 1):
- print("%d: " % PlayerLevel, end='')
- for MonsterLevel in range(MinMonsterLevel, MaxMonsterLevel + 1):
- XPMultiplier = GetXPMultiplier(PlayerLevel, MonsterLevel)
- print("%.2f " % XPMultiplier, end='')
- print("")
- def GetXML(filename, MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel):
- file = open(filename, "w")
- if file:
- file.write('<?xml version="1.0" encoding="UTF-8"?>\n')
- file.write('<?mso-application progid="Excel.Sheet"?>\n')
- file.write('<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="https://www.w3.org/TR/html401/">\n')
- # <NumberFormat ss:Format="0.0%"/>
- file.write('<Styles>\n')
- file.write('<Style ss:ID="C0"><Interior ss:Color="#FF0000" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
- file.write('<Style ss:ID="C1"><Interior ss:Color="#FF3300" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
- file.write('<Style ss:ID="C2"><Interior ss:Color="#FF7700" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
- file.write('<Style ss:ID="C3"><Interior ss:Color="#FFBB00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
- file.write('<Style ss:ID="C4"><Interior ss:Color="#FFFF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
- file.write('<Style ss:ID="C5"><Interior ss:Color="#BBFF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
- file.write('<Style ss:ID="C6"><Interior ss:Color="#77FF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
- file.write('<Style ss:ID="C7"><Interior ss:Color="#33FF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
- file.write('<Style ss:ID="C8"><Interior ss:Color="#00FF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
- file.write('<Style ss:ID="GREY"><Interior ss:Color="#EEEEEE" ss:Pattern="Solid"/></Style>\n')
- file.write('</Styles>\n')
- file.write('<Worksheet ss:Name="ExpPenalty">\n')
- file.write('<Table>\n')
- file.write('<Column ss:Index="1" ss:AutoFitWidth="0" ss:Width="120"/>\n')
- file.write('<Row>\n')
- if IsEffectiveMosterLevel:
- file.write('<Cell ss:StyleID="GREY"><Data ss:Type="String">PlayerLevel\EffectiveMonsterLevel</Data></Cell>\n')
- else:
- file.write('<Cell ss:StyleID="GREY"><Data ss:Type="String">PlayerLevel\MonsterLevel</Data></Cell>\n')
- for MonsterLevel in range(MinMonsterLevel, MaxMonsterLevel + 1):
- if MonsterLevel >= 68:
- file.write('<Cell ss:StyleID="GREY"><Data ss:Type="String">%d (T%d)</Data></Cell>\n' % (MonsterLevel, MonsterLevel - 67))
- else:
- file.write('<Cell ss:StyleID="GREY"><Data ss:Type="String">%d</Data></Cell>\n' % MonsterLevel)
- file.write('</Row>\n')
- for PlayerLevel in range(MinPlayerLevel, MaxPlayerLevel + 1):
- file.write('<Row>\n')
- file.write('<Cell ss:StyleID="GREY"><Data ss:Type="Number">%d</Data></Cell>\n' % PlayerLevel)
- for MonsterLevel in range(MinMonsterLevel, MaxMonsterLevel + 1):
- XPMultiplier = GetEffectiveXPMultiplier(PlayerLevel, MonsterLevel) if IsEffectiveMosterLevel else GetXPMultiplier(PlayerLevel, MonsterLevel)
- #file.write('<Cell ss:StyleID="C%d"><Data ss:Type="Number">%.4f</Data></Cell>\n' % (int(XPMultiplier * 7), XPMultiplier))
- file.write('<Cell ss:StyleID="C%d"><Data ss:Type="String">%.2f%%</Data></Cell>\n' % (int(XPMultiplier * 7), XPMultiplier * 100))
- file.write('</Row>\n')
- file.write('</Table>\n')
- file.write('</Worksheet>\n')
- file.write('</Workbook>\n')
- file.close()
- MinPlayerLevel = 1
- MaxPlayerLevel = 99
- MinMonsterLevel = 1
- MaxMonsterLevel = 83
- #GenTable(MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel)
- GetXML("PoE_ExperienceMultiplier.xml", MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel = False)
- GetXML("PoE_EffectiveExperienceMultiplier.xml", MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel = True)
- MinPlayerLevel = 68
- MaxPlayerLevel = 99
- MinMonsterLevel = 68
- MaxMonsterLevel = 83
- #GenTable(MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel)
- GetXML("PoE_ExperienceMultiplierForMapping.xml", MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel = False)
- GetXML("PoE_EffectiveExperienceMultiplierForMapping.xml", MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel = True)
- #print("%.2f" % (100 - GetXPMultiplier(99, 83) * 100))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement