172
|
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
|
183
|
58 def stdDieToDClass(self, match):
|
172
|
59 s = match.group(0)
|
183
|
60 self.mod = str(match.string[len(s):])
|
172
|
61 num_sides = s.split('d')
|
|
62 if len(num_sides) > 1:
|
|
63 num_sides; num = num_sides[0]; sides = num_sides[1]
|
183
|
64 if sides.strip().upper() == 'F': sides = "'f'"
|
|
65 try:
|
|
66 if int(num) > 100 or int(sides) > 10000: return None
|
|
67 except: pass
|
172
|
68 ret = ['(', num.strip(), "**die_rollers['", self.getRoller(), "'](",
|
183
|
69 sides.strip(), '))'+self.mod]
|
|
70 s = ''.join(ret); s = str(eval(s)); return s ## Moved eval here for portability.
|
|
71 ## Portable Non Standard Die Characters #Prof-Ebral
|
|
72 else: s = die_rollers._rollers[self.getRoller()]().non_stdDie(s); self.mod = ''; return s
|
172
|
73
|
|
74 # Use this to convert ndm-style (3d6) dice to d_base format
|
|
75 def convertTheDieString(self,s):
|
|
76 reg = re.compile("(?:\d+|\([0-9\*/\-\+]+\))\s*[a-zA-Z]+\s*[\dFf]+")
|
|
77 (result, num_matches) = reg.subn(self.stdDieToDClass, s)
|
|
78 if num_matches == 0 or result is None:
|
183
|
79 reg = re.compile("(?:\d+|\([0-9\*/\-\+]+\))\s*[a-zA-Z]+\s*[a-zA-Z]+") ## Prof Ebral
|
|
80 (result, num_matches) = reg.subn(self.stdDieToDClass, s) ## Prof Ebral
|
|
81 """try: ## Kinda pointless when you can create new Regular Expressions
|
|
82 s2 = self.roller_class + "(0)." + s ## Broken method
|
172
|
83 test = eval(s2)
|
|
84 return s2
|
183
|
85 except Exception, e: print e; pass"""
|
|
86 try: return self.do_math(s)
|
172
|
87 except: pass
|
|
88 return result
|
|
89
|
183
|
90 def do_math(self, s):
|
|
91 self.mod = ''
|
|
92 return str(eval(s))
|
|
93
|
172
|
94 def proccessRoll(self, s):
|
183
|
95 v = str(self.convertTheDieString(s))
|
|
96 return v[:len(v)-len(self.mod)]
|
|
97
|