* Allow overrides of sin/cos functions, also makes them locals.
* Only make one created array per bullet, and don't extend it with empty things.
* Local cache for action.owner and action.params.
self.previous_fire_direction = other.previous_fire_direction
self.previous_fire_speed = other.previous_fire_speed
self.previous_fire_direction = other.previous_fire_direction
self.previous_fire_speed = other.previous_fire_speed
- def step(self, owner, rank):
+ def step(self, owner, rank, created, sin=math.sin, cos=math.cos):
"""Advance by one frame."""
"""Advance by one frame."""
if self.speed_frames > 0:
self.speed_frames -= 1
if self.speed_frames > 0:
self.speed_frames -= 1
owner.my += self.my
if self.pc is None:
owner.my += self.my
if self.pc is None:
if self.wait_frames > 0:
self.wait_frames -= 1
if self.wait_frames > 0:
self.wait_frames -= 1
action = self.actions[self.pc]
if isinstance(action, parser.Repeat):
action = self.actions[self.pc]
if isinstance(action, parser.Repeat):
- repeat, (actions, params) = action(self.params, rank)
+ repeat, (actions, params) = action(s_params, rank)
child = Action(owner, self, actions, params, rank, repeat)
owner.replace(self, child)
child = Action(owner, self, actions, params, rank, repeat)
owner.replace(self, child)
- created.extend(child.step(owner, rank))
+ child.step(owner, rank, created, sin, cos)
break
elif isinstance(action, (parser.ActionDef, parser.ActionRef)):
break
elif isinstance(action, (parser.ActionDef, parser.ActionRef)):
- actions, params = action(self.params, rank)
+ actions, params = action(s_params, rank)
child = Action(owner, self, actions, params, rank)
owner.replace(self, child)
child = Action(owner, self, actions, params, rank)
owner.replace(self, child)
- created.extend(child.step(owner, rank))
+ child.step(owner, rank, created, sin, cos)
break
elif isinstance(action, (parser.FireDef, parser.FireRef)):
break
elif isinstance(action, (parser.FireDef, parser.FireRef)):
- direction, speed, actions, offset = action(self.params, rank)
+ direction, speed, actions, offset = action(s_params, rank)
if direction:
direction, type = direction
if type == "aim" or type is None:
if direction:
direction, type = direction
if type == "aim" or type is None:
x, y = owner.x, owner.y
if offset:
x, y = owner.x, owner.y
if offset:
- off_x, off_y = offset(self.params, rank)
+ off_x, off_y = offset(s_params, rank)
if offset.type == "relative":
if offset.type == "relative":
- sin = math.sin(direction)
- cos = math.cos(direction)
- x += cos * off_x + sin * off_y
- y += sin * off_x - cos * off_y
+ s = sin(direction)
+ c = cos(direction)
+ x += c * off_x + s * off_y
+ y += s * off_x - c * off_y
else:
x += off_x
y += off_y
else:
x += off_x
y += off_y
created.append(bullet)
elif isinstance(action, parser.ChangeSpeed):
created.append(bullet)
elif isinstance(action, parser.ChangeSpeed):
- frames, (speed, type) = action(self.params, rank)
+ frames, (speed, type) = action(s_params, rank)
self.speed_frames = frames
if type == "sequence":
self.speed = speed
self.speed_frames = frames
if type == "sequence":
self.speed = speed
self.speed = (speed - owner.speed) / frames
elif isinstance(action, parser.ChangeDirection):
self.speed = (speed - owner.speed) / frames
elif isinstance(action, parser.ChangeDirection):
- frames, (direction, type) = action(self.params, rank)
+ frames, (direction, type) = action(s_params, rank)
self.direction_frames = frames
self.aiming = False
if type == "sequence":
self.direction = direction
else:
if type == "absolute":
self.direction_frames = frames
self.aiming = False
if type == "sequence":
self.direction = direction
else:
if type == "absolute":
- self.direction = (
- direction - owner.direction) % PI_2
+ direction -= owner.direction
- self.direction = direction
- self.direction = (
- direction
- + owner.aim
- - owner.direction) % PI_2
+ direction += owner.aim - owner.direction
- if self.direction > math.pi:
- self.direction -= PI_2
- if self.direction < -math.pi:
- self.direction += PI_2
- self.direction /= self.direction_frames
+ self.direction = (
+ (direction + math.pi) % PI_2 - math.pi) / frames
elif isinstance(action, parser.Accel):
elif isinstance(action, parser.Accel):
- frames, horizontal, vertical = action(self.params, rank)
+ frames, horizontal, vertical = action(s_params, rank)
self.accel_frames = frames
if horizontal:
mx, type = horizontal
self.accel_frames = frames
if horizontal:
mx, type = horizontal
pass
elif isinstance(action, parser.Wait):
pass
elif isinstance(action, parser.Wait):
- self.wait_frames = action(self.params, rank)
+ self.wait_frames = action(s_params, rank)
break
elif isinstance(action, parser.Vanish):
owner.vanish()
break
break
elif isinstance(action, parser.Vanish):
owner.vanish()
break
class Bullet(object):
"""Simple bullet implementation.
class Bullet(object):
"""Simple bullet implementation.
else:
self._actions[idx] = new
else:
self._actions[idx] = new
+ def step(self, sin=math.sin, cos=math.cos):
"""Advance by one frame.
This updates the position and velocity, and may also set the
"""Advance by one frame.
This updates the position and velocity, and may also set the
created = []
for action in self._actions:
created = []
for action in self._actions:
- created.extend(action.step(self, self.rank))
+ action.step(self, self.rank, created, sin, cos)
self.px = self.x
self.py = self.y
self.px = self.x
self.py = self.y
- self.x += self.mx + math.sin(self.direction) * self.speed
- self.y += self.my - math.cos(self.direction) * self.speed
+ self.x += self.mx + sin(self.direction) * self.speed
+ self.y += self.my - cos(self.direction) * self.speed