bulletml-runner: Flash the screen when the mouse hits a bullet.
[python-bulletml.git] / bulletml / parser.py
index c8bc990..150ca45 100644 (file)
@@ -367,11 +367,7 @@ class Repeat(object):
 
     def __call__(self, owner, action, params, rank, created):
         repeat = self.times(params, rank)
-        actions, params = self.action(params, rank)
-        child = action.Child(actions, 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)
@@ -422,11 +418,15 @@ class If(object):
             branch = self.else_
 
         if branch:
-            actions, params = branch(params, rank)
-            child = action.Child(actions, 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_:
+            return "%s(%r, then=%r, else_=%r)" % (
+                type(self).__name__, self.cond, self.then, self.else_)
+        else:
+            return "%s(%r, then=%r)" % (
+                type(self).__name__, self.cond, self.then)
         
 class Accel(object):
     """Accelerate over some time."""
@@ -560,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),
@@ -601,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)" % (
@@ -646,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)
@@ -680,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)" % (
@@ -805,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:
@@ -858,7 +868,7 @@ class FireDef(object):
         bullet = owner.__class__(
             x=x, y=y, direction=direction, speed=speed,
             target=owner.target, actions=actions, rank=rank,
-            appearance=appearance, tags=tags, Action=action.__class__)
+            appearance=appearance, tags=tags)
         created.append(bullet)
 
     def __repr__(self):