from math import atan2, sin, cos
-from bulletml.parser import ActionDef, ActionRef
-
__all__ = ["Action", "Bullet"]
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:
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:
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):
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)
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)
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_:
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),
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)" % (
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)
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)" % (
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:
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,