From e0a48bf90fd856cb7009eb2140187145c7d0ebaf Mon Sep 17 00:00:00 2001 From: Joe Wreschnig Date: Thu, 22 Apr 2010 21:47:08 -0700 Subject: [PATCH] Action.step: Remove special-case dependency on ActionDef / ActionRef. --- bulletml/impl.py | 22 ++++------------------ bulletml/parser.py | 41 +++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 38 deletions(-) diff --git a/bulletml/impl.py b/bulletml/impl.py index 836fb41..8ef78ab 100644 --- a/bulletml/impl.py +++ b/bulletml/impl.py @@ -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) diff --git a/bulletml/parser.py b/bulletml/parser.py index 8bc23c0..150ca45 100644 --- a/bulletml/parser.py +++ b/bulletml/parser.py @@ -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, -- 2.20.1