def process_turret(field, robot, dt): """Get new turret position and rotation attributes for a time-delta.""" new_robot = lib.clone_struct(robot) move_to_angle = lib.first([robot.fire_angle, robot.turret_final_angle], pred=lambda x: x is not None) new_bullets = [] new_turret_angle = robot.turret_angle + dt * robot.turret_rotation if move_to_angle is not None: old_direction = geometry.get_direction_for_rotation( robot.angle + robot.turret_angle, move_to_angle) new_direction = geometry.get_direction_for_rotation( robot.angle + new_turret_angle, move_to_angle) if old_direction * new_direction < 0: new_robot.turret_rotation = 0.0 if robot.fire_angle: new_bullet = fire_bullet(robot, field) new_bullets.append(new_bullet) new_turret_angle = move_to_angle - robot.angle new_robot.fire_angle = None new_robot.turret_final_angle = None else: max_speed = field.config["robot"]["turret_rotation_max_speed"] new_robot.turret_rotation = max_speed * new_direction else: new_bullets = [] new_robot.turret_angle = geometry.normalize_angle(new_turret_angle) # Update time to fire if robot.time_to_fire: new_robot.time_to_fire -= dt if new_robot.time_to_fire < 0: new_robot.time_to_fire = 0.0 return StateChange(update_robots=[new_robot], new_bullets=new_bullets)
def test_get_direction_for_rotation(self): self.assertEqual(geometry.get_direction_for_rotation(45, 60), +1) self.assertEqual(geometry.get_direction_for_rotation(45, 160), +1) self.assertEqual(geometry.get_direction_for_rotation(45, 200), +1) self.assertEqual(geometry.get_direction_for_rotation(45, -190), +1) self.assertEqual(geometry.get_direction_for_rotation(45, -100), -1) self.assertEqual(geometry.get_direction_for_rotation(45, -20), -1) self.assertEqual(geometry.get_direction_for_rotation(150, 360.0), -1)