~ryanprior/+junk/python-srd

« back to all changes in this revision

Viewing changes to test.py

  • Committer: Ryan Prior
  • Date: 2010-12-10 22:05:08 UTC
  • Revision ID: ryanprior@gmail.com-20101210220508-8cs3nu9454hksvv2
initialĀ import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
from srd.dnd import Combatant, Attack, Weapon
 
4
from srd import phb
 
5
from sim import avg_damage, simulations, print_sim_update, bout
 
6
from copy import deepcopy
 
7
 
 
8
fl5_greataxe = Combatant(
 
9
  name = "axe fighter level 5",
 
10
  hitdice="25+4d10",
 
11
#  stats = {"str":18,
 
12
#           "dex":12,
 
13
#           "con":16,
 
14
#           "int":8,
 
15
#           "wis":10,
 
16
#           "cha":8,},
 
17
  bab=5,
 
18
  weapons = (phb.greataxe,),
 
19
  two_handed=True,
 
20
  ac_bonuses = ["+8 armor"],
 
21
)
 
22
 
 
23
fl5_greatsword = Combatant(
 
24
  name = "greatsword fighter level 5",
 
25
  hitdice = "25+4d10",
 
26
#  stats = {"str":18,
 
27
#           "dex":12,
 
28
#           "con":16,
 
29
#           "int":8,
 
30
#           "wis":10,
 
31
#           "cha":8,},
 
32
  bab=5,
 
33
  weapons = (phb.greatsword,),
 
34
  two_handed = True,
 
35
  ac_bonuses = ["+8 armor"],
 
36
)
 
37
 
 
38
fl1_axe = Combatant(
 
39
  name = "axe fighter level 1",
 
40
  hitdice = "12",
 
41
  stats = {"str":14,
 
42
           "dex":14,
 
43
           "con":14,
 
44
           "int":8,
 
45
           "wis":12,
 
46
           "cha":8,},
 
47
  bab=1,
 
48
  weapons = (phb.greataxe,),
 
49
  two_handed = True,
 
50
  ac_bonuses = ["+5 breastplate"],
 
51
  hit_bonuses = ["+1 weapon_focus"],
 
52
  init_bonuses = ["+4 feat"], #improved initiative
 
53
)
 
54
fl1_swordnboard = Combatant(
 
55
  name = "sword-n-board fighter level 1",
 
56
  hitdice = "12",
 
57
  stats = {"str":14,
 
58
           "dex":14,
 
59
           "con":14,
 
60
           "int":8,
 
61
           "wis":12,
 
62
           "cha":8,},
 
63
  bab=1,
 
64
  weapons = (phb.longsword,),
 
65
  ac_bonuses = ["+5 breastplate","+2 shield","+1 dodge"],
 
66
  hit_bonuses = ["+1 weapon_focus"],
 
67
)
 
68
 
 
69
rangerl1_twf = Combatant(
 
70
        bab=1,
 
71
        weapons = (phb.sword_two_bladed,),
 
72
        ac_bonuses = ["+4 chainshirt"],
 
73
        stats = {"str":14,
 
74
                "dex":14,
 
75
                "con":14,
 
76
                "int":8,
 
77
                "wis":12,
 
78
                "cha":8,},
 
79
        two_weapon_fighting = 1,
 
80
        name = "ranger level 1 (two-weapon)",
 
81
        hitdice = "13", # toughness
 
82
)
 
83
 
 
84
def print_disclaimer():
 
85
  print "results not accurate: simulation was performed", simulations, "times."
 
86
 
 
87
def print_average(attack, min_ac=10, max_ac=20):
 
88
  print "simulated average damage per turn for", attack.weapon.name
 
89
  for i in xrange(min_ac, max_ac+1):
 
90
    print "against AC %d : ~%s" % (i, avg_damage(attack, i))
 
91
  print_disclaimer()
 
92
 
 
93
def print_average_fullattack(attacks, min_ac=10, max_ac=20):
 
94
  print "simulated average damage per turn for %s:" % (" and ".join([str(i) for i in attacks]),)
 
95
  for i in xrange(min_ac, max_ac+1):
 
96
    damage = 0
 
97
    for j in attacks:
 
98
      damage += avg_damage(j, i)
 
99
    print "against AC %d : ~%s" % (i, damage)
 
100
  print_disclaimer()
 
101
 
 
102
def print_marginal_bonus(attack_a, attack_b, min_ac=10, max_ac=20):
 
103
  print "simulated average marginal bonus damage: %s vs %s" % (attack_a.weapon.name, attack_b.weapon.name)
 
104
  for i in xrange(min_ac, max_ac+1):
 
105
    print "against AC %d : ~%s" % (i, avg_damage(attack_a, i) - avg_damage(attack_b, i))
 
106
  print_disclaimer()
 
107
 
 
108
def print_win_percent(combatant_a, combatant_b):
 
109
  a_wins = 0.0
 
110
  b_wins = 0.0
 
111
  for i in xrange(simulations):
 
112
    print_sim_update(i)
 
113
    combatant_a.hp = combatant_a.max_hp
 
114
    combatant_b.hp = combatant_b.max_hp
 
115
    winner = bout((combatant_a, combatant_b))
 
116
    if winner is combatant_a:
 
117
      a_wins += 1.0
 
118
    else:
 
119
      b_wins += 1.0
 
120
  print "\n%s wins %s percent of the time" % (combatant_a, (a_wins / float(simulations) * 100))
 
121
  print_disclaimer()
 
122
 
 
123
try:
 
124
  pass
 
125
  fl5_greatsword.team = 0
 
126
  fl5_greataxe.team = 1
 
127
  print_win_percent(fl5_greataxe, fl5_greatsword)
 
128
except KeyboardInterrupt:
 
129
  print "cancelled"
 
130
 
 
131
 
 
132
 
 
133
 
 
134
 
 
135