Advertisement
DajDwaZlote

PoE_ExpPenalty.py

Jan 13th, 2021
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.59 KB | None | 0 0
  1. # PoE_ExpPenalty.py
  2. # by DajDwaZlote
  3. # v1.1
  4. ###
  5. import math
  6. import sys
  7.  
  8. def GetSafeZone(PlayerLevel):
  9.     return math.floor(3 + PlayerLevel / 16)
  10.    
  11. def GetEffectiveDifference(PlayerLevel, MonsterLevel):
  12.     SafeZone = GetSafeZone(PlayerLevel)
  13.    
  14.     return max(abs(PlayerLevel - MonsterLevel) - SafeZone, 0)
  15.    
  16. def Get3_1_XP_Penalty(PlayerLevel):
  17.     LevelToFactor = {
  18.         95 : 1.065,
  19.         96 : 1.115,
  20.         97 : 1.187,
  21.         98 : 1.2825,
  22.         99 : 1.4
  23.     }
  24.     return LevelToFactor.get(PlayerLevel, 1)
  25.    
  26. def GetEffectiveMosterLevel(MonterLevel):
  27.     return -0.03 * MonterLevel * MonterLevel + 5.17 * MonterLevel - 144.9
  28.    
  29. def GetXPMultiplier(PlayerLevel, MonsterLevel):
  30.     EffectiveDifference = GetEffectiveDifference(PlayerLevel, MonsterLevel)
  31.  
  32.     A = pow((PlayerLevel + 5) / (PlayerLevel + 5 + pow(EffectiveDifference, 2.5)), 1.5)
  33.    
  34.     if PlayerLevel < 95:
  35.         return max(A, 0.01)
  36.     else:
  37.         B = 1 / (1 + 0.1 * (PlayerLevel - 94))
  38.         C = 1 / Get3_1_XP_Penalty(PlayerLevel)
  39.        
  40.         return max(A * B * C, 0.01)
  41.        
  42. def GetEffectiveXPMultiplier(PlayerLevel, MonsterLevel):  
  43.     EffectiveMosterLevel = GetEffectiveMosterLevel(MonsterLevel) if MonsterLevel >= 70 else MonsterLevel
  44.    
  45.     return GetXPMultiplier(PlayerLevel, EffectiveMosterLevel)
  46.  
  47. def GenTable(MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel):
  48.     for PlayerLevel in range(MinPlayerLevel, MaxPlayerLevel + 1):
  49.         print("%d: " % PlayerLevel, end='')
  50.        
  51.         for MonsterLevel in range(MinMonsterLevel, MaxMonsterLevel + 1):
  52.             XPMultiplier = GetXPMultiplier(PlayerLevel, MonsterLevel)
  53.  
  54.             print("%.2f  " % XPMultiplier, end='')
  55.         print("")
  56.    
  57. def GetXML(filename, MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel):
  58.     file = open(filename, "w")
  59.     if file:
  60.         file.write('<?xml version="1.0" encoding="UTF-8"?>\n')
  61.         file.write('<?mso-application progid="Excel.Sheet"?>\n')
  62.         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')
  63.        
  64.         # <NumberFormat ss:Format="0.0%"/>
  65.         file.write('<Styles>\n')
  66.         file.write('<Style ss:ID="C0"><Interior ss:Color="#FF0000" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
  67.         file.write('<Style ss:ID="C1"><Interior ss:Color="#FF3300" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
  68.         file.write('<Style ss:ID="C2"><Interior ss:Color="#FF7700" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
  69.         file.write('<Style ss:ID="C3"><Interior ss:Color="#FFBB00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
  70.         file.write('<Style ss:ID="C4"><Interior ss:Color="#FFFF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
  71.         file.write('<Style ss:ID="C5"><Interior ss:Color="#BBFF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
  72.         file.write('<Style ss:ID="C6"><Interior ss:Color="#77FF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
  73.         file.write('<Style ss:ID="C7"><Interior ss:Color="#33FF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
  74.         file.write('<Style ss:ID="C8"><Interior ss:Color="#00FF00" ss:Pattern="Solid"/><Alignment ss:Horizontal="Right" ss:WrapText="1"/></Style>\n')
  75.         file.write('<Style ss:ID="GREY"><Interior ss:Color="#EEEEEE" ss:Pattern="Solid"/></Style>\n')
  76.         file.write('</Styles>\n')
  77.        
  78.         file.write('<Worksheet ss:Name="ExpPenalty">\n')
  79.         file.write('<Table>\n')
  80.         file.write('<Column ss:Index="1" ss:AutoFitWidth="0" ss:Width="120"/>\n')
  81.        
  82.         file.write('<Row>\n')
  83.         if IsEffectiveMosterLevel:
  84.             file.write('<Cell ss:StyleID="GREY"><Data ss:Type="String">PlayerLevel\EffectiveMonsterLevel</Data></Cell>\n')
  85.         else:
  86.             file.write('<Cell ss:StyleID="GREY"><Data ss:Type="String">PlayerLevel\MonsterLevel</Data></Cell>\n')
  87.            
  88.         for MonsterLevel in range(MinMonsterLevel, MaxMonsterLevel + 1):
  89.             if MonsterLevel >= 68:
  90.                 file.write('<Cell ss:StyleID="GREY"><Data ss:Type="String">%d (T%d)</Data></Cell>\n' % (MonsterLevel, MonsterLevel - 67))
  91.             else:
  92.                 file.write('<Cell ss:StyleID="GREY"><Data ss:Type="String">%d</Data></Cell>\n' % MonsterLevel)
  93.         file.write('</Row>\n')
  94.        
  95.         for PlayerLevel in range(MinPlayerLevel, MaxPlayerLevel + 1):
  96.             file.write('<Row>\n')
  97.             file.write('<Cell ss:StyleID="GREY"><Data ss:Type="Number">%d</Data></Cell>\n' % PlayerLevel)
  98.             for MonsterLevel in range(MinMonsterLevel, MaxMonsterLevel + 1):
  99.                 XPMultiplier = GetEffectiveXPMultiplier(PlayerLevel, MonsterLevel) if IsEffectiveMosterLevel else GetXPMultiplier(PlayerLevel, MonsterLevel)
  100.                 #file.write('<Cell ss:StyleID="C%d"><Data ss:Type="Number">%.4f</Data></Cell>\n' % (int(XPMultiplier * 7), XPMultiplier))
  101.                 file.write('<Cell ss:StyleID="C%d"><Data ss:Type="String">%.2f%%</Data></Cell>\n' % (int(XPMultiplier * 7), XPMultiplier * 100))
  102.             file.write('</Row>\n')
  103.  
  104.         file.write('</Table>\n')
  105.         file.write('</Worksheet>\n')
  106.         file.write('</Workbook>\n')
  107.        
  108.         file.close()
  109.        
  110. MinPlayerLevel  = 1
  111. MaxPlayerLevel  = 99
  112.  
  113. MinMonsterLevel = 1
  114. MaxMonsterLevel = 83
  115.  
  116. #GenTable(MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel)
  117. GetXML("PoE_ExperienceMultiplier.xml", MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel = False)
  118. GetXML("PoE_EffectiveExperienceMultiplier.xml", MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel = True)
  119. MinPlayerLevel  = 68
  120. MaxPlayerLevel  = 99
  121.  
  122. MinMonsterLevel = 68
  123. MaxMonsterLevel = 83
  124.  
  125. #GenTable(MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel)
  126. GetXML("PoE_ExperienceMultiplierForMapping.xml", MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel = False)
  127. GetXML("PoE_EffectiveExperienceMultiplierForMapping.xml", MinPlayerLevel, MaxPlayerLevel, MinMonsterLevel, MaxMonsterLevel, IsEffectiveMosterLevel = True)
  128.  
  129. #print("%.2f" % (100 - GetXPMultiplier(99, 83) * 100))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement