def perform(self, comms): goal = self.world.our_goal robots = filter(lambda r: not r.is_missing(), self.world.their_robots) robots.sort(key=lambda r: math.hypot(r.x - goal.x, r.y - goal.y)) if len(robots) == 0: logging.error("There is no enemy here. Gimme someone to destroy!") return 1 robot = robots[0] cone_upper = math.atan2(goal.x - robot.x, goal.higher_post - robot.y) % (2 * pi) cone_lower = math.atan2(goal.x - robot.x, goal.lower_post - robot.y) % (2 * pi) if robot.angle < min(cone_upper, cone_lower) or robot.angle > max(cone_upper, cone_lower): critical_angle = (cone_upper + cone_lower) / 2 else: critical_angle = robot.angle target_rotation = (critical_angle - self.robot.angle + pi / 2) % pi - pi / 2 if (critical_angle - self.robot.angle + pi / 2) % pi - pi / 2 <= 0.6: target_rotation = 0 dist = utils.defender_get_alignment_offset(self.robot, robot, critical_angle, target_rotation) logging.info("Aligning with enemy. (Rotate %f degrees, move %f right)", math.degrees(target_rotation), dist) if abs(dist) > MOVEMENT_THRESHOLD and abs(target_rotation) > ROTATION_THRESHOLD: comms.turn_then_move(target_rotation, dist) return utils.defender_turn_delay(target_rotation) + utils.defender_move_delay(dist) elif abs(dist) > MOVEMENT_THRESHOLD: comms.move(dist) return utils.defender_move_delay(dist) elif abs(target_rotation) > ROTATION_THRESHOLD: comms.turn(target_rotation) return utils.defender_turn_delay(target_rotation)
def perform(self, comms): target_rotation = (self.world.ball.angle - self.robot.angle + pi / 2) % pi - pi / 2 dist = utils.defender_get_alignment_offset(self.robot, self.world.ball, self.world.ball.angle, target_rotation) logging.info("Aligning with ball. (Rotate %f degrees, move %f right)", math.degrees(target_rotation), dist) if abs(dist) > MOVEMENT_THRESHOLD: comms.turn_then_move(target_rotation, dist) return utils.defender_turn_delay(target_rotation) + utils.defender_move_delay(dist) else: comms.turn(target_rotation) return utils.defender_turn_delay(target_rotation)
def perform(self, comms): dist = utils.defender_get_alignment_offset(self.robot, self.world.ball, self.world.ball.angle) logging.info("Aligning with ball. (Move %f right)", dist) if abs(dist) > MOVEMENT_THRESHOLD: comms.move(dist) return utils.defender_move_delay(dist)