Guest User

Untitled

a guest
Aug 18th, 2018
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.21 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # Copyright © 2018 Taylor C. Richberger <taywee@gmx.com>
  4. # This code is released under the MIT license
  5.  
  6. import locale
  7. import argparse
  8. from collections import namedtuple
  9.  
  10. Threshold = namedtuple('Threshold', ['easy', 'medium', 'hard', 'deadly'])
  11.  
  12. THRESHOLDS = {
  13. 1: Threshold(easy=25, medium=50, hard=75, deadly=100),
  14. 2: Threshold(easy=50, medium=100, hard=150, deadly=200),
  15. 3: Threshold(easy=75, medium=150, hard=225, deadly=400),
  16. 4: Threshold(easy=125, medium=250, hard=375, deadly=500),
  17. 5: Threshold(easy=250, medium=500, hard=750, deadly=1100),
  18. 6: Threshold(easy=300, medium=600, hard=900, deadly=1400),
  19. 7: Threshold(easy=350, medium=750, hard=1100, deadly=1700),
  20. 8: Threshold(easy=450, medium=900, hard=1400, deadly=2100),
  21. 9: Threshold(easy=550, medium=1100, hard=1600, deadly=2400),
  22. 10: Threshold(easy=600, medium=1200, hard=1900, deadly=2800),
  23. 11: Threshold(easy=800, medium=1600, hard=2400, deadly=3600),
  24. 12: Threshold(easy=1000, medium=2000, hard=3000, deadly=4500),
  25. 13: Threshold(easy=1100, medium=2200, hard=3400, deadly=5100),
  26. 14: Threshold(easy=1250, medium=2500, hard=3800, deadly=5700),
  27. 15: Threshold(easy=1400, medium=2800, hard=4300, deadly=6400),
  28. 16: Threshold(easy=1600, medium=3200, hard=4800, deadly=7200),
  29. 17: Threshold(easy=2000, medium=3900, hard=5900, deadly=8800),
  30. 18: Threshold(easy=2100, medium=4200, hard=6300, deadly=9500),
  31. 19: Threshold(easy=2400, medium=4900, hard=7300, deadly=10900),
  32. 20: Threshold(easy=2800, medium=5700, hard=8500, deadly=12700),
  33. }
  34.  
  35. MULTIPLIERS = [0.5, 1, 1.5, 2, 2.5, 3, 4, 5]
  36. MULTIPLIER_SELECTOR = [0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5]
  37.  
  38. def multiplier(playercount, monstercount):
  39. '''Find the multiplier based on the player count and monster count'''
  40.  
  41. if monstercount > 15:
  42. monstercount = 15
  43. monstercount -= 1
  44.  
  45. index = MULTIPLIER_SELECTOR[monstercount]
  46.  
  47. if playercount < 3:
  48. index += 2
  49. elif playercount < 6:
  50. index += 1
  51.  
  52. return MULTIPLIERS[index]
  53.  
  54. def party_threshold(levels):
  55. '''Calculate the total difficulty threshold based on player levels'''
  56.  
  57. easy = 0
  58. medium = 0
  59. hard = 0
  60. deadly = 0
  61.  
  62. for level in levels:
  63. threshold = THRESHOLDS[level]
  64. easy += threshold.easy
  65. medium += threshold.medium
  66. hard += threshold.hard
  67. deadly += threshold.deadly
  68. return Threshold(easy, medium, hard, deadly)
  69.  
  70.  
  71. def main():
  72. parser = argparse.ArgumentParser(description='Help calculate encounter difficulty')
  73. parser.add_argument('-V', '--version', action='version', version='0.1')
  74. parser.add_argument('-m', '--monster', dest='monsters', help='The monster experiences, for calculating difficulty', type=int, nargs='*', default=None)
  75. parser.add_argument('levels', help='The player levels, required', type=int, nargs='+')
  76. args = parser.parse_args()
  77.  
  78. threshold = party_threshold(args.levels)
  79.  
  80. print('Difficulty level experience thresholds for party:')
  81. print('{:6} {:6} {:6} {:6}'.format('easy', 'medium', 'hard', 'deadly'))
  82. print('{:6} {:6} {:6} {:6}'.format(threshold.easy, threshold.medium, threshold.hard, threshold.deadly))
  83. print()
  84.  
  85. if args.monsters:
  86. total_monster_exp = sum(args.monsters)
  87. mult = multiplier(playercount=len(args.levels), monstercount=len(args.monsters))
  88. modified_monster_exp = total_monster_exp * mult
  89. if modified_monster_exp > threshold.deadly:
  90. difficulty = 'deadly'
  91. elif modified_monster_exp > threshold.hard:
  92. difficulty = 'hard'
  93. elif modified_monster_exp > threshold.medium:
  94. difficulty = 'medium'
  95. elif modified_monster_exp > threshold.easy:
  96. difficulty = 'easy'
  97. else:
  98. difficulty = 'trivial'
  99.  
  100. print('Combined monster experience is {}'.format(total_monster_exp))
  101. print('Is multiplied by {} to become {}'.format(mult, modified_monster_exp))
  102. print('This encounter is {}'.format(difficulty))
  103. else:
  104. print('Total experience for difficulty based on monster count:')
  105. print('{:>2}: {:6} {:6} {:6} {:6}'.format('#', 'easy', 'medium', 'hard', 'deadly'))
  106. for count in range(1, 16):
  107. mult = multiplier(playercount=len(args.levels), monstercount=count)
  108. print('{:>2}: {:6} {:6} {:6} {:6}'.format(
  109. count,
  110. round(threshold.easy / mult),
  111. round(threshold.medium / mult),
  112. round(threshold.hard / mult),
  113. round(threshold.deadly / mult),
  114. ))
  115. print()
  116.  
  117. print('Average per-monster experience for same table:')
  118. print('{:>2}: {:6} {:6} {:6} {:6}'.format('#', 'easy', 'medium', 'hard', 'deadly'))
  119. for count in range(1, 16):
  120. mult = multiplier(playercount=len(args.levels), monstercount=count)
  121. print('{:>2}: {:6} {:6} {:6} {:6}'.format(
  122. count,
  123. round(threshold.easy / mult / count),
  124. round(threshold.medium / mult / count),
  125. round(threshold.hard / mult / count),
  126. round(threshold.deadly / mult / count),
  127. ))
  128.  
  129. if __name__ == '__main__':
  130. locale.setlocale(locale.LC_ALL, '')
  131. main()
Add Comment
Please, Sign In to add comment