Add <tag> support to BulletDef and FireDef.
[python-bulletml.git] / bulletml / parser.py
index e9b0488..8f253fe 100644 (file)
@@ -358,10 +358,11 @@ class BulletDef(object):
     direction = None
     speed = None
 
-    def __init__(self, actions=[], direction=None, speed=None):
+    def __init__(self, actions=[], direction=None, speed=None, tags=()):
         self.direction = direction
         self.speed = speed
         self.actions = list(actions)
+        self.tags = set(tags)
 
     def __getstate__(self):
         state = []
@@ -371,6 +372,8 @@ class BulletDef(object):
             state.append(("speed", self.speed))
         if self.actions:
             state.append(("actions", self.actions))
+        if self.tags:
+            state.append(("tags", list(self.tags)))
         return state
 
     def __setstate__(self, state):
@@ -393,6 +396,8 @@ class BulletDef(object):
                 actions.append(ActionDef.FromXML(doc, subelem))
             elif tag == "actionRef":
                 actions.append(ActionRef.FromXML(doc, subelem))
+            elif tag == "tag":
+                self.tags.add(subelem.text)
         dfn = cls(actions, direction, speed)
         doc._bullets[element.get("label")] = dfn
         return dfn
@@ -402,6 +407,7 @@ class BulletDef(object):
         return (
             self.direction and self.direction(params, rank),
             self.speed and self.speed(params, rank),
+            self.tags,
             actions)
 
     def __repr__(self):
@@ -567,11 +573,13 @@ class Offset(object):
 class FireDef(object):
     """Fire definition (creates a bullet)."""
 
-    def __init__(self, bullet, direction=None, speed=None, offset=None):
+    def __init__(
+        self, bullet, direction=None, speed=None, offset=None, tags=()):
         self.bullet = bullet
         self.direction = direction
         self.speed = speed
         self.offset = offset
+        self.tags = set(tags)
 
     def __getstate__(self):
         state = []
@@ -581,6 +589,8 @@ class FireDef(object):
             state.append(("speed", self.speed))
         if self.offset:
             state.append(("offset", self.offset))
+        if self.tags:
+            state.append(("tags", list(self.tags)))
         try:
             params = self.bullet.params
         except AttributeError:
@@ -616,6 +626,8 @@ class FireDef(object):
                 bullet = BulletRef.FromXML(doc, subelem)
             elif tag == "offset":
                 offset = Offset.FromXML(doc, subelem)
+            elif tag == "tag":
+                self.tags.add(subelem.text)
         try:
             fire = cls(bullet, direction, speed, offset)
         except UnboundLocalError as exc:
@@ -625,12 +637,13 @@ class FireDef(object):
             return fire
 
     def __call__(self, params, rank):
-        direction, speed, actions = self.bullet(params, rank)
+        direction, speed, tags, actions = self.bullet(params, rank)
         if self.direction:
             direction = self.direction(params, rank)
         if self.speed:
             speed = self.speed(params, rank)
-        return direction, speed, actions, self.offset
+        tags = tags.union(self.tags)
+        return direction, speed, self.offset, tags, actions
 
     def __repr__(self):
         return "%s(direction=%r, speed=%r, bullet=%r)" % (