class Marksman < RTanque::Bot::Brain
  NAME = 'MarksmanSample_testbattle'
  include RTanque::Bot::BrainHelper
 
  def tick!
    command.speed = RTanque::Bot::MAX_SPEED
    nearest = nearest_target()
 
    if (!defined?(@direction))
      @direction = 0
      @previousTargetX = 0
      @previousTargetY = 0
    end
 
    if (nearest)
        targetX = sensors.position.x + Math.sin(nearest.heading) * nearest.distance
        targetY = sensors.position.y + Math.cos(nearest.heading) * nearest.distance
 
        power = RTanque::Bot::MAX_FIRE_POWER
 
        predictedTargetX = targetX + (targetX - @previousTargetX) * nearest.distance / (5.0 * power)
        predictedTargetY = targetY + (targetY - @previousTargetY) * nearest.distance / (5.0 * power)
 
        deltaX = predictedTargetX - sensors.position.x
        deltaY = predictedTargetY - sensors.position.y
 
        tan = deltaX / deltaY
        if (deltaX > 0 && deltaY > 0)
          angle = Math.atan(tan)
        elsif (deltaX > 0 && deltaY < 0)
          angle = Math::PI - Math.atan(-tan)
        elsif (deltaX < 0 && deltaY > 0)
          angle = Math::PI * 2 - Math.atan(-tan)
        elsif (deltaX < 0 && deltaY < 0)
          angle = Math::PI + Math.atan(tan)
        end
 
        @previousTargetX = targetX
        @previousTargetY = targetY
 
        command.radar_heading = nearest.heading
        command.turret_heading = angle
        command.fire(power)
    else
        command.radar_heading = sensors.radar_heading + RTanque::Heading::ONE_DEGREE * 10.0
    end
 
    onWall = false
    if (sensors.position.on_top_wall?)
        command.heading = RTanque::Heading::SOUTH
        onWall = true
    elsif (sensors.position.on_bottom_wall?)
        command.heading = RTanque::Heading::NORTH
        onWall = true
    elsif (sensors.position.on_left_wall?)
        command.heading = RTanque::Heading::EAST
        onWall = true
    elsif (sensors.position.on_right_wall?)
        command.heading = RTanque::Heading::WEST
        onWall = true
    end
 
    if (onWall)
      if (sensors.heading.delta(command.heading) > 0)
        @direction = 1
      else
        @direction = -1
      end
    else
        if (Random.rand(80) < 1)
            @direction = 0 - @direction
        end
 
        command.heading = sensors.heading + @direction * RTanque::Heading::ONE_DEGREE * 5.0
    end
  end
 
  # this function borrowed from rort1.rb (https://gist.github.com/ronald/5146511)
  def nearest_target
    reflections = sensors.radar
    reflections = reflections.reject{|r| r.name == NAME } unless @friendly_fire
    reflections.sort_by{|r| r.distance }.first
  end
end