Action.step: Remove special-case dependency on ActionDef / ActionRef.
authorJoe Wreschnig <joe.wreschnig@gmail.com>
Fri, 23 Apr 2010 04:47:08 +0000 (21:47 -0700)
committerJoe Wreschnig <joe.wreschnig@gmail.com>
Fri, 23 Apr 2010 04:47:08 +0000 (21:47 -0700)
bulletml/impl.py
bulletml/parser.py

index 836fb410c4efbaaafec9a1c60c7d90b2b7bf50e9..8ef78abd7f0863f65fb379f812809e9bfdfde92e 100644 (file)
@@ -4,8 +4,6 @@ from __future__ import division
 
 from math import atan2, sin, cos
 
-from bulletml.parser import ActionDef, ActionRef
-
 __all__ = ["Action", "Bullet"]
 
 class Action(object):
@@ -48,10 +46,6 @@ class Action(object):
         return "%s(pc=%r, actions=%r)" % (
             type(self).__name__, self.pc, self.actions)
 
-    def Child(self, action, params, rank, repeat=1):
-        actions, params = action(params, rank)
-        return type(self)(self, actions, params, rank, repeat)
-
     def vanish(self):
         """End this action and its parents."""
         if self.parent:
@@ -80,8 +74,8 @@ class Action(object):
             owner.speed += self.speed
 
         if self.direction_frames > 0:
-            # I'm still not sure what the aim check is supposed to do.
             self.direction_frames -= 1
+            # I'm still not sure what the aim check is supposed to do.
             if self.aiming and self.direction_frames <= 0:
                 owner.direction += owner.aim
             else:
@@ -120,13 +114,7 @@ class Action(object):
                     self.pc = 0
                     action = self.actions[self.pc]
 
-            if isinstance(action, (ActionDef, ActionRef)):
-                child = self.Child(action, s_params, rank)
-                owner.replace(self, child)
-                child.step(owner, created)
-                break
-
-            elif action(owner, self, s_params, rank, created):
+            if action(owner, self, s_params, rank, created):
                 break
 
 class Bullet(object):
@@ -171,10 +159,8 @@ class Bullet(object):
     def FromDocument(cls, doc, x=0, y=0, direction=0, speed=0, target=None,
                      params=(), rank=0.5, Action=Action):
         """Construct a new Bullet from a loaded BulletML document."""
-        actions = [action(params, rank) for action in doc.actions]
-        # New bullets reset the parent hierarchy.
-        actions = [Action(None, action, params, rank)
-                   for action, params in actions]
+        actions = [action(None, Action, params, rank)
+                   for action in doc.actions]
         return cls(x=x, y=y, direction=direction, speed=speed,
                    target=target, actions=actions, rank=rank)
 
index 8bc23c0be3334f3471b046a5ef13512f6dda380b..150ca4544ef53d6a43f177c7957ef709c1ccf537 100644 (file)
@@ -367,10 +367,7 @@ class Repeat(object):
 
     def __call__(self, owner, action, params, rank, created):
         repeat = self.times(params, rank)
-        child = action.Child(self.action, params, rank, repeat)
-        owner.replace(action, child)
-        child.step(owner, created)
-        return True
+        return self.action(owner, action, params, rank, created, repeat)
 
     def __repr__(self):
         return "%s(%r, %r)" % (type(self).__name__, self.times, self.action)
@@ -421,10 +418,7 @@ class If(object):
             branch = self.else_
 
         if branch:
-            child = action.Child(branch, params, rank)
-            owner.replace(action, child)
-            child.step(owner, created)
-            return True
+            return branch(owner, action, params, rank, created)
 
     def __repr__(self):
         if self.else_:
@@ -566,8 +560,9 @@ class BulletDef(object):
         doc._bullets[element.get("label")] = dfn
         return dfn
 
-    def __call__(self, params, rank):
-        actions = [action(params, rank) for action in self.actions]
+    def __call__(self, owner, action, params, rank, created):
+        actions = [a(None, action, params, rank, created)
+                   for a in self.actions]
         return (
             self.direction and self.direction(params, rank),
             self.speed and self.speed(params, rank),
@@ -607,8 +602,9 @@ class BulletRef(object):
         doc._bullet_refs.append(bullet)
         return bullet
 
-    def __call__(self, params, rank):
-        return self.bullet(self.params(params, rank), rank)
+    def __call__(self, owner, action, params, rank, created):
+        params = self.params(params, rank)
+        return self.bullet(owner, action, params, rank, created)
 
     def __repr__(self):
         return "%s(params=%r, bullet=%r)" % (
@@ -652,8 +648,14 @@ class ActionDef(object):
         doc._actions[element.get("label")] = dfn
         return dfn
 
-    def __call__(self, params, rank):
-        return self.actions, params
+    def __call__(self, owner, action, params, rank, created=(), repeat=1):
+        Action = action if isinstance(action, type) else type(action) 
+        parent = None if owner is None else action
+        child = Action(parent, self.actions, params, rank, repeat)
+        if owner is not None:
+            owner.replace(parent, child)
+            child.step(owner, created)
+        return child
 
     def __repr__(self):
         return "%s(%r)" % (type(self).__name__, self.actions)
@@ -686,8 +688,9 @@ class ActionRef(object):
         doc._action_refs.append(action)
         return action
 
-    def __call__(self, params, rank):
-        return self.action(self.params(params, rank), rank)
+    def __call__(self, owner, action, params, rank, created=(), repeat=1):
+        params = self.params(params, rank)
+        return self.action(owner, action, params, rank, created, repeat)
 
     def __repr__(self):
         return "%s(params=%r, action=%r)" % (
@@ -811,7 +814,8 @@ class FireDef(object):
             return fire
 
     def __call__(self, owner, action, params, rank, created):
-        direction, speed, tags, appearance, actions = self.bullet(params, rank)
+        direction, speed, tags, appearance, actions = self.bullet(
+            owner, action, params, rank, created)
         if self.direction:
             direction = self.direction(params, rank)
         if self.speed:
@@ -861,9 +865,6 @@ class FireDef(object):
 
         if appearance is None:
             appearance = owner.appearance
-        Action = action.__class__
-        actions = [Action(None, action, params, rank)
-                   for action, params in actions]
         bullet = owner.__class__(
             x=x, y=y, direction=direction, speed=speed,
             target=owner.target, actions=actions, rank=rank,