Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- FOL_MANA_COST = 140
- class Paladin:
- BASE_MANA = 1512
- BASE_INT = 70
- BASE_CRIT = 5
- def __init__(self, intellect=0, mp5=0, crit_chance=0, illu_lvl=0):
- self.intellect = self.BASE_INT + intellect
- self.mana = self.BASE_MANA + self.intellect * 15
- self.crit_chance = self.BASE_CRIT + (self.intellect / 28.5) + crit_chance
- self.mp5 = mp5
- self.spell_cost = FOL_MANA_COST
- self.illu_lvl = illu_lvl
- self.mp5_regen = 0
- self.crit_regen = 0
- self.spells_cast = 0
- def cast_spell(self):
- if self.mana - self.spell_cost < 0:
- raise ValueError('OOM')
- self.spells_cast += 1
- self.mana -= self.spell_cost
- is_crit = random.random() < (self.crit_chance / 100)
- if is_crit:
- is_mana_returned = random.random() < (self.illu_lvl * 20 / 100)
- if is_mana_returned:
- self.mana += self.spell_cost
- self.crit_regen += self.spell_cost
- def tick_mana(self):
- self.mana += self.mp5
- self.mp5_regen += self.mp5
- class Run:
- def __init__(self, paladin):
- self.paladin = paladin
- self.time = 0
- def run(self):
- while True:
- self.time += 1
- if self.time % 15 == 0:
- try:
- self.paladin.cast_spell()
- except ValueError:
- break
- if self.time % 50 == 0:
- self.paladin.tick_mana()
- return self
- runs = 1_000
- all_time = 0
- all_mp5_regen = 0
- all_crit_regen = 0
- all_spells_cast = 0
- for _ in range(runs):
- r = Run(mana=5500, mp5=33, spell_cost=FOL_MANA_COST, crit_chance=5, illu_lvl=5).run()
- all_time += r.time
- all_mp5_regen += r.mp5_regen
- all_crit_regen += r.crit_regen
- all_spells_cast += r.spells_cast
- avg_time = all_time / runs
- avg_mp5_regen = all_mp5_regen / runs
- avg_crit_regen = all_crit_regen / runs
- avg_spells_cast = all_spells_cast / runs
- print(avg_time / 10, 's')
- print(f'mana regened by mp5: {avg_mp5_regen}')
- print(f'mana returned by crits: {avg_crit_regen}')
- print(f'spells cast: {avg_spells_cast}')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement