Exemplo n.º 1
0
    def __init__(self, car: Car, info: GameInfo, target: vec3):
        super().__init__(car)

        self.target = target
        self.info = info

        self.carry = Carry(car, info.ball, target)
        self.flick = AirDodge(car, 0.15, info.ball.position)
        self.flicking = False
Exemplo n.º 2
0
class CarryAndFlick(Maneuver):
    """
    Carry the ball on roof, and flick it if an opponent is close or
    if fast enough and facing the target.
    """
    def __init__(self, car: Car, info: GameInfo, target: vec3):
        super().__init__(car)

        self.target = target
        self.info = info

        self.carry = Carry(car, info.ball, target)
        self.flick = AirDodge(car,
                              jump_duration=0.1,
                              target=info.ball.position)
        self.flicking = False

    def interruptible(self) -> bool:
        return not self.flicking

    def step(self, dt):
        if not self.flicking:
            self.carry.step(dt)
            self.controls = self.carry.controls
            self.finished = self.carry.finished
            car = self.car
            ball = self.info.ball

            # check if it's a good idea to flick
            dir_to_target = ground_direction(car, self.target)
            if (distance(car, ball) < 150 and ground_distance(car, ball) < 100
                    and dot(car.forward(), dir_to_target) > 0.7
                    and norm(car.velocity) > clamp(
                        distance(car, self.target) / 3, 1000, 1700)
                    and dot(dir_to_target, ground_direction(car, ball)) > 0.9):
                self.flicking = True

            # flick if opponent is close
            for opponent in self.info.get_opponents():
                if (distance(opponent.position + opponent.velocity, car) < max(
                        300.0,
                        norm(opponent.velocity) * 0.5)
                        and dot(opponent.velocity,
                                direction(opponent, self.info.ball)) > 0.5):
                    if distance(car.position, self.info.ball.position) < 200:
                        self.flicking = True
                    else:
                        self.finished = True
        else:
            self.flick.target = self.info.ball.position + self.info.ball.velocity * 0.2
            self.flick.step(dt)
            self.controls = self.flick.controls
            self.finished = self.flick.finished

    def render(self, draw: DrawingTool):
        if not self.flicking:
            self.carry.render(draw)
Exemplo n.º 3
0
class Dribble(Maneuver):
    '''
    Carry the ball on roof, and flick it if an opponent is close or
    if fast enough and facing the target.
    '''
    def __init__(self, car: Car, info: GameInfo, target: vec3):
        super().__init__(car)

        self.target = target
        self.info = info

        self.carry = Carry(car, info.ball, target)
        self.flick = AirDodge(car, 0.15, info.ball.position)
        self.flicking = False

    def step(self, dt):
        if not self.flicking:
            self.carry.step(dt)
            self.controls = self.carry.controls
            self.finished = self.carry.finished
            car = self.car

            # check if it's a good idea to flick
            dir_to_target = direction(ground(car.position),
                                      ground(self.target))
            if (distance(car.position, self.info.ball.position) < 150
                    and distance(ground(car.position),
                                 ground(self.info.ball.position)) < 80
                    and dot(car.forward(), dir_to_target) > 0.7
                    and norm(car.velocity) > distance(car, self.target) / 4
                    and norm(car.velocity) > 1300 and dot(
                        dir_to_target,
                        direction(ground(car.position),
                                  ground(self.info.ball.position))) > 0.9):
                self.flicking = True

            # flick if opponent is close
            for opponent in self.info.opponents:
                if (distance(opponent.position + opponent.velocity, car) < max(
                        300,
                        norm(opponent.velocity) * 0.5)
                        and dot(opponent.velocity,
                                direction(opponent, self.info.ball)) > 0.5):
                    if distance(car.position, self.info.ball.position) < 350:
                        self.flicking = True
                    else:
                        self.finished = True
        else:
            self.flick.step(dt)
            self.controls = self.flick.controls
            self.finished = self.flick.finished

    def render(self, draw: DrawingTool):
        if not self.flicking:
            self.carry.render(draw)
Exemplo n.º 4
0
    def __init__(self, car: Car, info: GameInfo, target: vec3):
        super().__init__(car)

        self.target = target
        self.info = info

        self.carry = Carry(car, info.ball, target)
        self.flick = Dodge(car)
        self.flick.duration = 0.15
        self.flick.target = target
        self.flicking = False
Exemplo n.º 5
0
class Dribble(Maneuver):
    def __init__(self, car: Car, info: GameInfo, target: vec3):
        super().__init__(car)

        self.target = target
        self.info = info

        #self.catch = Catch(car, info, target)
        self.carry = Carry(car, info.ball, target)
        self.flick = AirDodge(car, 0.15, info.ball.pos)
        self.flicking = False

    def step(self, dt):
        #if not self.catch.finished:
        #    self.catch.step(dt)
        #    self.controls = self.catch.controls
        if not self.flicking:
            self.carry.step(dt)
            self.controls = self.carry.controls
            self.finished = self.carry.finished
            car = self.car

            dir_to_target = direction(ground(car.pos), ground(self.target))
            if (distance(ground(car.pos), ground(self.info.ball.pos)) < 80
                    and dot(car.forward(), dir_to_target) > 0.95
                    and norm(car.vel) > distance(car, self.target) / 3
                    and norm(car.vel) > 1500 and
                    dot(dir_to_target,
                        direction(ground(car.pos), ground(
                            self.info.ball.pos))) > 0.95):
                self.flicking = True

            for opponent in self.info.opponents:
                if distance(opponent, car) < max(800, norm(opponent.vel)):
                    self.flicking = True
        else:
            self.flick.step(dt)
            self.controls = self.flick.controls
            self.finished = self.flick.finished

    def render(self, draw: DrawingTool):
        if not self.flicking:
            self.carry.render(draw)