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:
|
195
|
25 # $Id: utils.py,v Traipse 'Ornery-Orc' prof.ebral Exp $
|
168
|
26 #
|
|
27 # Description: Classes to help manage the die roller
|
|
28 #
|
|
29
|
195
|
30 __version__ = "$Id: utils.py,v Traipse 'Ornery-Orc' prof.ebral Exp Exp $"
|
168
|
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
|
177
|
58 def stdDieToDClass(self, match):
|
195
|
59 s = match.group(0); self.eval = str(match.string)
|
168
|
60 num_sides = s.split('d')
|
|
61 if len(num_sides) > 1:
|
|
62 num_sides; num = num_sides[0]; sides = num_sides[1]
|
177
|
63 if sides.strip().upper() == 'F': sides = "'f'"
|
|
64 try:
|
|
65 if int(num) > 100 or int(sides) > 10000: return None
|
|
66 except: pass
|
168
|
67 ret = ['(', num.strip(), "**die_rollers['", self.getRoller(), "'](",
|
195
|
68 sides.strip(), '))']
|
|
69 s = ''.join(ret)
|
|
70 self.eval = s
|
|
71 return s
|
|
72
|
179
|
73 ## Portable Non Standard Die Characters #Prof-Ebral
|
195
|
74 else: s = die_rollers._rollers[self.getRoller()]().non_stdDie(s); return s
|
168
|
75
|
|
76 # Use this to convert ndm-style (3d6) dice to d_base format
|
|
77 def convertTheDieString(self,s):
|
195
|
78 self.result = ''
|
168
|
79 reg = re.compile("(?:\d+|\([0-9\*/\-\+]+\))\s*[a-zA-Z]+\s*[\dFf]+")
|
|
80 (result, num_matches) = reg.subn(self.stdDieToDClass, s)
|
|
81 if num_matches == 0 or result is None:
|
177
|
82 reg = re.compile("(?:\d+|\([0-9\*/\-\+]+\))\s*[a-zA-Z]+\s*[a-zA-Z]+") ## Prof Ebral
|
|
83 (result, num_matches) = reg.subn(self.stdDieToDClass, s) ## Prof Ebral
|
|
84 """try: ## Kinda pointless when you can create new Regular Expressions
|
|
85 s2 = self.roller_class + "(0)." + s ## Broken method
|
168
|
86 test = eval(s2)
|
|
87 return s2
|
177
|
88 except Exception, e: print e; pass"""
|
195
|
89 self.result = result
|
179
|
90 try: return self.do_math(s)
|
|
91 except: pass
|
168
|
92 return result
|
|
93
|
179
|
94 def do_math(self, s):
|
|
95 return str(eval(s))
|
|
96
|
168
|
97 def proccessRoll(self, s):
|
195
|
98 v = self.convertTheDieString(s)
|
|
99 try: b = str(eval(v))
|
|
100 except:
|
|
101 if v == self.eval: b = s
|
|
102 else: b = str(v) ##Fail safe for non standard dice.
|
|
103 return b
|
177
|
104
|