diff orpg/dieroller/d20.py @ 0:4385a7d0efd1 grumpy-goblin

Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author sirebral
date Tue, 14 Jul 2009 16:41:58 -0500
parents
children 449a8900f9ac
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/orpg/dieroller/d20.py	Tue Jul 14 16:41:58 2009 -0500
@@ -0,0 +1,111 @@
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# --
+#
+# File: d20.py
+# Author: OpenRPG Dev Team
+# Maintainer:
+# Version:
+#   $Id: d20.py,v 1.9 2006/11/04 21:24:19 digitalxero Exp $
+#
+# Description: d20 die roller
+#
+from die import *
+
+__version__ = "$Id: d20.py,v 1.9 2006/11/04 21:24:19 digitalxero Exp $"
+
+# d20 stands for "d20 system" not 20 sided die :)
+
+class d20(std):
+    def __init__(self,source=[]):
+        std.__init__(self,source)
+
+# these methods return new die objects for specific options
+
+    def attack(self,AC,mod,critical):
+        return d20attack(self,AC,mod,critical)
+
+    def dc(self,DC,mod):
+        return d20dc(self,DC,mod)
+
+class d20dc(std):
+    def __init__(self,source=[],DC=10,mod=0):
+        std.__init__(self,source)
+        self.DC = DC
+        self.mod = mod
+        self.append(static_di(mod))
+
+    def is_success(self):
+        return ((self.sum() >= self.DC or self.data[0] == 20) and self.data[0] != 1)
+
+    def __str__(self):
+        myStr = "[" + str(self.data[0])
+        for a in self.data[1:]:
+            myStr += ","
+            myStr += str(a)
+        myStr += "] = (" + str(self.sum()) + ")"
+
+        myStr += " vs DC " + str(self.DC)
+
+        if self.is_success():
+            myStr += " Success!"
+        else:
+            myStr += " Failure!"
+
+        return myStr
+
+
+class d20attack(std):
+    def __init__(self,source=[],AC=10,mod=0,critical=20):
+        std.__init__(self,source)
+        self.mod = mod
+        self.critical = critical
+        self.AC = AC
+        self.append(static_di(mod))
+        self.critical_check()
+
+    def attack(AC=10,mod=0,critical=20):
+        self.mod = mod
+        self.critical = critical
+        self.AC = AC
+
+    def critical_check(self):
+        self.critical_result = 0
+        self.critical_roll = 0
+        if self.data[0] >= self.critical and self.is_hit():
+            self.critical_roll = die_base(20) + self.mod
+            if self.critical_roll.sum() >= self.AC:
+                self.critical_result = 1
+
+    def is_critical(self):
+        return self.critical_result
+
+    def is_hit(self):
+        return ((self.sum() >= self.AC or self.data[0] == 20) and self.data[0] != 1)
+
+    def __str__(self):
+        myStr = "[" + str(self.data[0])
+        for a in self.data[1:]:
+            myStr += ","
+            myStr += str(a)
+        myStr += "] = (" + str(self.sum()) + ")"
+
+        myStr += " vs AC " + str(self.AC)
+
+        if self.is_critical():
+            myStr += " Critical"
+
+        if self.is_hit():
+            myStr += " Hit!"
+        else:
+            myStr += " Miss!"
+
+        return myStr