168
|
1 #!/usr/bin/env python
|
|
2 # Copyright (C) 2000-2001 The OpenRPG Project
|
|
3 #
|
|
4 # openrpg-dev@lists.sourceforge.net
|
|
5 #
|
|
6 # This program is free software; you can redistribute it and/or modify
|
|
7 # it under the terms of the GNU General Public License as published by
|
|
8 # the Free Software Foundation; either version 2 of the License, or
|
|
9 # (at your option) any later version.
|
|
10 #
|
|
11 # This program is distributed in the hope that it will be useful,
|
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14 # GNU General Public License for more details.
|
|
15 #
|
|
16 # You should have received a copy of the GNU General Public License
|
|
17 # along with this program; if not, write to the Free Software
|
|
18 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
19 # --
|
|
20 #
|
|
21 # File: dieroller/utils.py
|
|
22 # Author: OpenRPG Team
|
|
23 # Maintainer:
|
|
24 # Version:
|
|
25 # $Id: utils.py,v 1.22 2007/05/05 05:30:10 digitalxero Exp $
|
|
26 #
|
|
27 # Description: Classes to help manage the die roller
|
|
28 #
|
|
29
|
|
30 __version__ = "$Id: utils.py,v 1.22 2007/05/05 05:30:10 digitalxero Exp $"
|
|
31
|
|
32 import re
|
|
33
|
|
34 import orpg.dieroller.rollers
|
|
35 from orpg.dieroller.base import die_rollers
|
|
36
|
|
37 class roller_manager(object):
|
|
38 def __new__(cls):
|
|
39 it = cls.__dict__.get("__it__")
|
|
40 if it is not None: return it
|
|
41 cls.__it__ = it = object.__new__(cls)
|
|
42 it._init()
|
|
43 return it
|
|
44
|
|
45 def _init(self):
|
|
46 self.setRoller('std')
|
|
47
|
|
48 def setRoller(self, roller_class):
|
|
49 try: self.roller_class = die_rollers[roller_class]
|
|
50 except KeyError: raise Exception("Invalid die roller!")
|
|
51
|
|
52 def getRoller(self):
|
|
53 return self.roller_class.name
|
|
54
|
|
55 def listRollers(self):
|
|
56 return die_rollers.keys()
|
|
57
|
|
58 def stdDieToDClass(self,match):
|
|
59 s = match.group(0)
|
|
60 num_sides = s.split('d')
|
|
61 if len(num_sides) > 1: num_sides; num = num_sides[0]; sides = num_sides[1]
|
|
62 else: return self.non_stdDieToDClass(s) # Use a non standard converter.
|
|
63
|
|
64 if sides.strip().upper() == 'F': sides = "'f'"
|
|
65 try:
|
|
66 if int(num) > 100 or int(sides) > 10000: return None
|
|
67 except: pass
|
|
68 ret = ['(', num.strip(), "**die_rollers['", self.getRoller(), "'](",
|
|
69 sides.strip(), '))']
|
|
70 return ''.join(ret)
|
|
71
|
|
72 def non_stdDieToDClass(self, s):
|
|
73 num_sides = s.split('v')
|
|
74 if len(num_sides) > 1:
|
|
75 num_sides; num = num_sides[0]; sides = num_sides[1]
|
|
76 if self.getRoller() == 'mythos': sides = '12'; target = num_sides[1]
|
|
77 elif self.getRoller() == 'wod': sides = '10'; target = num_sides[1]
|
|
78 ret = ['(', num.strip(), "**die_rollers['", self.getRoller(), "'](",
|
|
79 sides.strip(), ')).vs(', target, ')']
|
|
80 return ''.join(ret)
|
|
81
|
|
82 num_sides = s.split('k')
|
|
83 if len(num_sides) > 1:
|
|
84 num_sides; num = num_sides[0]; sides = '10'; target = num_sides[1]
|
|
85 ret = ['(', num.strip(), "**die_rollers['", self.getRoller(), "'](",
|
|
86 sides.strip(), ')).takeHighest(', target, ').open(10)']
|
|
87 return ''.join(ret)
|
|
88
|
|
89 # Use this to convert ndm-style (3d6) dice to d_base format
|
|
90 def convertTheDieString(self,s):
|
|
91 reg = re.compile("(?:\d+|\([0-9\*/\-\+]+\))\s*[a-zA-Z]+\s*[\dFf]+")
|
|
92 (result, num_matches) = reg.subn(self.stdDieToDClass, s)
|
|
93 if num_matches == 0 or result is None:
|
|
94 try:
|
|
95 s2 = self.roller_class + "(0)." + s
|
|
96 test = eval(s2)
|
|
97 return s2
|
|
98 except: pass
|
|
99 return result
|
|
100
|
|
101 def proccessRoll(self, s):
|
|
102 return str(eval(self.convertTheDieString(s)))
|