class GotoBallSkill:
   def __init__(self, goalDistance=100):
      self.trackBallSkill = TrackBallSkill()
      self.scanForBallSkill = ScanForBallSkill()
      self.goalDistance = goalDistance

   def execute(self, b, h, l):
         if Robot.lBallLostCount() > 15 :
            self.scanForBallSkill.execute(b, h, l)
            return False
         else:
            self.trackBallSkill.execute(b, h, l)

         heading = Robot.vRrBallLocation()['heading']
         distance = Robot.vRrBallLocation()['distance']

         distance -= self.goalDistance
         b.actionType(ActionCommand.Body.FAST)
         if degrees(heading) < abs(30):
            b.turn(heading/2.0)
            b.forward(int(distance/2.5))
            b.left(0)
         else:
            b.forward(0)
            b.left(0)
            b.turn(heading/2.0)

         if distance < 15 and abs(heading) < radians(5):
            return True
         return False
class DribbleSkill:
   def __init__(self):
      self.scanForBallSkill = ScanForBallSkill()
      self.gotoBallSkill = GotoBallSkill()

   def execute(self, b, h, l):
      if Robot.lBallLostCount() > 15:
         self.scanForBallSkill.execute(b, h, l)
         b.actionType(ActionCommand.Body.WALK)
         # debug leds
         l.leftEye(1, 0, 0)
         l.rightEye(1, 0, 0)
      else:
         self.gotoBallSkill.execute(b, h, l)
         # debug leds
         l.leftEye(0, 1, 0)
         l.rightEye(0, 1, 0)
 def __init__(self, goalDistance=100):
    self.trackBallSkill = TrackBallSkill()
    self.scanForBallSkill = ScanForBallSkill()
    self.goalDistance = goalDistance
 def __init__(self):
    self.scanForBallSkill = ScanForBallSkill()
    self.gotoBallSkill = GotoBallSkill()