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)