Example #1
0
def execute_pass_play(game):
    """
    Executes a pass play
    """
    pass_type_mod = 0
    sack_mod = 0
    #TODO implement sack_mod based on defensive play call
    pass_type = 0
    #TODO implement pass_type calculation

    if pass_type is 3:
        # if total run plays - 3 >= total pass plays in this game by the offense
        pass_type_mod = 5
        # else pass_type_mod = -5
    if game.pass_type is 4:
        pass_type_mod = 10

    if random_chance(determine_completion_chance(game) + pass_type_mod):
        return execute_completed_pass(game, pass_type)
    else:
        incompletion_chance = 85.0 + (game.offense.pass_blocking / 5.0) \
            - (1.5 * (100 - game.defense.gameplan.d_run) / 100.0) \
            + (2.0 * game.play_mod) \
            + (0.5 * (game.offense.team_mod - game.defense.team_mod)) \
            + ((100.0 - game.offense.gameplan.o_aggression) / 100.0) \
            - (game.defense.gameplan.d_aggression / 100.0) \
            + random_variability()

        choices = [
            (1, int(determine_sack_chance(game), sack_mod)),
            (2, 0),
            (3, int(incompletion_chance))
        ]
        result = random_weighted_choice(choices)

        if result == 1:
            print('sack!')  # sack()
            #TODO implement sack() method
        elif result == 2:
            print('interception!')  # interception()
            #TODO implement interception() method
        # elif check_scramble():
        else:
            print('incomplete!')  # incompletion()
Example #2
0
def execute_onside_kickoff(game):
    """
    Executes an onside kickoff play
    """
    recover = random_weighted_choice(
            1, game.offense.calculate_special_teams_rating(game.offense.players),
            2, game.defense.calculate_special_teams_rating(game.defense.players) + 100)

    recovering_team = game.offense if recover == 1 else game.defense

    game.yard_line = 100 - 35 - 10 - random_in_range(0, 3)

    game = spend_time(2, 5, 5, False)

    #TODO log onside kick attempt and update game state

    if recovering_team is game.defense:
        return execute_turnover(game)

    game.down = 1
    game.to_go = game.yard_line if 10 > game.yard_line else 10

    return game
Example #3
0
def execute_run_play(game):
    """
    Executes a run play
    """
    rusher = None
    break_stat = 50.0
    rb1 = game.offense.get_player('RB', 1)
    fb = game.offense.get_player('FB', 1)
    te = game.offense.get_player('TE', 1)

    if game.togo is 1:
        break_stat = fb.speed * 0.75
        rusher = fb
    else:
        break_stat = rb1.agility
        rusher = rb1

    rush_mod = random.randint(-4, 3)
    min_rush = (-3.0
                + (5.0 * (game.offense.run_blocking / 100.0))
                + (3.25 * (rusher.break_tackle / 100.0))
                + (0.5 * (break_stat / 100.0))
                + (1.25 * (fb.run_blocking / 100.0))
                + (0.25 * (te.run_blocking / 100.0))
                - (5.0 * (game.defense.run_defense / 100.0))
                + (1.0 * game.play_mod)
                + (0.1 * (game.offense.team_mod - game.defense.team_mod))
                + (0.25 * game.run_mod)
                - (0.5 * game.defense.gameplan.d_run / 100.0)
                + (1.25 * (((100 - game.offense.gameplan.o_aggression)
                            - game.defense.gameplan.d_aggression) / 100.0))
                + random_variability()
                + rush_mod)

    if (game.yard_line > 95) and (min_rush < -1):
        min_rush = -1

    if (game.yard_line >= 99) and (min_rush < 0):
        if random_chance(rusher.break_tackle - 20):
            min_rush = 0

    rush_mod = random.randint(-3, 4)
    max_rush = (3.0
                + (6.25 * (game.offense.run_blocking / 100.0))
                + (7.5 * (rusher.break_tackle / 100.0))
                + (2.5 * (break_stat / 100.0))
                + (0.5 * (rusher.speed / 100.0))
                + (2.5 * (fb.run_blocking / 100.0))
                + (1.5 * (te.run_blocking / 100.0))
                + (1.0 * game.play_mod)
                + (0.1 * (game.offense.team_mod - game.defense.team_mod))
                + (0.25 * game.run_mod)
                - (0.5 * game.defense.gameplan.d_run / 100.0)
                + (1.25 * ((game.offense.gameplan.o_aggression
                - (100 - game.defense.gameplan.d_aggression)) / 100.0))
                + random_variability()) + rush_mod

    if game.defense.gameplan.d_style is '43':
        max_rush = (max_rush
                    - (8.5 * (game.defense.run_defense / 100.0))
                    - (3.0 * (game.defense.get_player('LOLB', 1).tackling / 100.0))
                    - (3.0 * (game.defense.get_player('MLB', 1).tackling / 100.0))
                    - (3.0 * (game.defense.get_player('ROLB', 1).tackling / 100.0)))

        if random_chance(100 - rusher.concentration) and random_chance(game.defense.run_defense / 2):
            min_rush -= 1

    else:
        max_rush = (max_rush
                    - (1.5 * (game.defense.run_defense / 100.0))
                    - (4.0 * (game.defense.get_player('LOLB', 1).tackling / 100.0))
                    - (4.0 * (game.defense.get_player('LILB', 1).tackling / 100.0))
                    - (4.0 * (game.defense.get_player('RILB', 1).tackling / 100.0))
                    - (4.0 * (game.defense.get_player('ROLB', 1).tackling / 100.0)))

        if random_chance(rusher.concentration) and random_chance(
                (game.defense.get_player('LOLB', 1).tackling
                 + game.defense.get_player('LILB', 1).tackling
                 + game.defense.get_player('RILB', 1).tackling
                 + game.defense.get_player('ROLB', 1).tackling)) / 8:
            max_rush -= 1

    if min_rush > max_rush:
        min_rush = max_rush

    gain = random.randint(int(min_rush), int(max_rush))

    if (gain >= 7
            or random_chance(break_stat / 4.0 + random_variability())
            and random_chance(rusher.speed / 1.5)):
        max_additional = ((22.0 * (rusher.speed / 100.0))
                          - (2.5 * (game.defense.get_player('LCB', 1).tackling / 100.0))
                          - (2.5 * (game.defense.get_player('RCB', 1).tackling / 100.0))
                          - (3.5 * (game.defense.get_player('SS', 1).tackling / 100.0))
                          - (3.5 * (game.defense.get_player('FS', 1).tackling / 100.0))
                          + (2.0 * game.play_mod)
                          + (0.5 * game.run_mod)
                          + (0.25 * (game.offense.team_mod - game.defense.team_mod))
                          + random_variability())

        if max_additional < 1:
            max_additional = 1

        gain += random.uniform(0, max_additional)

        big_play_mod = 0

        while random_chance(rusher.speed / 2 + (6 * big_play_mod)):
            max_additional = ((20.0 * (rusher.speed / 100.0))
                              - (2.5 * (game.defense.get_player('LCB', 1).tackling / 100.0))
                              - (2.5 * (game.defense.get_player('RCB', 1).tackling / 100.0))
                              - (3.5 * (game.defense.get_player('SS', 1).tackling / 100.0))
                              - (3.5 * (game.defense.get_player('FS', 1).tackling / 100.0))
                              + (2.0 * game.play_mod)
                              + (0.5 * game.run_mod)
                              + (0.25 * (game.offense.team_mod - game.defense.team_mod))
                              + random_variability())

            if max_additional < 1:
                max_additional = 1

            gain += random.uniform(0, max_additional)

            if random_chance(break_stat / 2):
                big_play_mod += 1

            if rusher.speed / 2 + (8 * big_play_mod) > 100:
                gain = 101

    if random_chance(105 - rusher.break_tackle):
        gain -= 1

    if gain < -5 and random_chance(90):
        gain = -5

    if gain < 0:
        weighted_choices = [(game.offense.get_player('LT', 1), 1),
                            (game.offense.get_player('LG', 1), 1),
                            (game.offense.get_player('C', 1), 1),
                            (game.offense.get_player('RG', 1), 1),
                            (game.offense.get_player('RT', 1), 1)]

        allowed_loss = random_weighted_choice(weighted_choices)

        # TODO record TFL allowed here
    elif gain > 5:
        foo = 0
        # TODO pancake logic, record pancacke here

    td = 0
    fumble = False

    if gain >= game.yard_line:
        gain = game.yard_line
        td = 1
    else:
        if game.defense.gameplan.d_style is '43':
            fum_chance = ((1.8 * rusher.concentration)
                          - (0.35 * game.defense.run_defense)
                          - (0.05 * game.defense.get_player('LOLB', 1).tackling)
                          - (0.05 * game.defense.get_player('MLB', 1).tackling)
                          - (0.05 * game.defense.get_player('ROLB', 1).tackling)
                          + (0.2 * (((100 - game.offense.gameplan.o_aggression)
                                     - game.defense.gameplan.d_aggression)))
                          + random_variability())
        else:
            fum_chance = ((1.8 * rusher.concentration)
                          - (0.1 * game.defense.run_defense)
                          - (0.1 * game.defense.get_player('LOLB', 1).tackling)
                          - (0.1 * game.defense.get_player('LILB', 1).tackling)
                          - (0.1 * game.defense.get_player('RILB', 1).tackling)
                          - (0.1 * game.defense.get_player('ROLB', 1).tackling)
                          + (0.2 * (((100 - game.offense.gameplan.o_aggression)
                                     - game.defense.gameplan.d_aggression)))
                          + random_variability())

        if fum_chance < 5:
            fum_chance = 5

        if int(random.uniform(0, int(fum_chance))) == 0:
            if (game.yard_line - gain) < 100.0:
                fumble = True

    fumble_forcer = game.defense.get_player('LDE', 1)

    if fumble:
        if gain < 6 and (random_chance(95) or random_chance(5)):
            if game.defense.gameplan.d_style is '43':
                choices = [
                    (game.defense.get_player('LOLB', 1), game.defense.get_player('LOLB', 1).tackling),
                    (game.defense.get_player('MLB', 1), game.defense.get_player('MLB', 1).tackling),
                    (game.defense.get_player('ROLB', 1), game.defense.get_player('ROLB', 1).tackling)
                ]
                fumble_forcer = random_weighted_choice(choices)
            else:
                choices = [
                    (game.defense.get_player('LOLB', 1), game.defense.get_player('LOLB', 1).tackling),
                    (game.defense.get_player('LILB', 1), game.defense.get_player('LILB', 1).tackling),
                    (game.defense.get_player('RILB', 1), game.defense.get_player('RILB', 1).tackling),
                    (game.defense.get_player('ROLB', 1), game.defense.get_player('ROLB', 1).tackling)
                ]
                fumble_forcer = random_weighted_choice(choices)
        else:
            choices = [
                (game.defense.get_player('LCB', 1), game.defense.get_player('LCB', 1).tackling),
                (game.defense.get_player('RCB', 1), game.defense.get_player('RCB', 1).tackling),
                (game.defense.get_player('SS', 1), game.defense.get_player('SS', 1).tackling),
                (game.defense.get_player('FS', 1), game.defense.get_player('FS', 1).tackling)
            ]
            fumble_forcer = random_weighted_choice(choices)

    #TODO finish implementing, including return type, play logging, turnover execution


    return game
Example #4
0
def execute_completed_pass(game, pass_type):
    """
    Executes a completed pass
    """
    pass_mod = random.randint(-5, 5)

    max_gain = (3.25
                + (10.0 * (game.offense.get_player('QB', 1).throw_power / 100.0))
                + (1.5 * game.play_mod)
                + (0.15 * (game.offense.team_mod - game.defense.team_mod))
                + (0.5 * game.pass_mod))

    gain = random.randint(int(1 + pass_mod), int(max_gain + pass_mod))

    if gain > 9:
        foo = 0
        #TODO implement pancacke logic

    if pass_type is 2:
        gain = random.randint(int(game.offense.get_player('QB', 1).throw_power / 2
                                  + pass_mod),
                              int(game.offense.get_player('QB', 1).throw_power / 2
                                  + max_gain + pass_mod))

    receiver = None

    check_down = False

    pass_mod = random.randint(-5, 5)

    ag_play = (72.5 +
               game.offense.get_player('QB', 1).throw_power / 10
               + ((game.offense.gameplan.o_aggression - 50) / 50) + ((game.defense.gameplan.d_aggression - 50) / 50)
               - (game.defense.get_player('CB', 1).coverage - 50) / 7.5
               - (game.defense.get_player('CB', 1).coverage - 50) / 7.5
               + game.pass_mod
               + game.play_mod
               + random_variability())

    if pass_type is 0:
        ag_play -= 5

    if pass_type is 1:
        ag_play += 5

    if ag_play > 80:
        ag_play = 80
    elif ag_play < 65:
        ag_play = 65

    if pass_type is 3:
        ag_play = 95

    if random_chance(ag_play):
        lb_coverage = (game.defense.get_player('LOLB', 1).coverage
                       + game.defense.get_player('ROLB', 1).coverage) - 100

        weighted_choices = [
            (game.offense.get_player('WR', 1),
             int((game.offense.get_player('WR', 1).catching * 3.05
                  + game.offense.get_player('WR', 1).acceleration
                  - ((game.defense.get_player('LCB', 1).coverage - 50.0) / 25.0)
                  + random_variability()))),
            (game.offense.get_player('WR', 2),
             int((game.offense.get_player('WR', 2).catching * 3.05
                  + game.offense.get_player('WR', 2).acceleration
                  - ((game.defense.get_player('RCB', 1).coverage - 50.0) / 25.0)
                  + random_variability()))),
            (game.offense.get_player('WR', 3),
             int((game.offense.get_player('WR', 3).catching * 3.05
                  + game.offense.get_player('WR', 3).acceleration
                  - ((game.defense.get_player('SS', 1).coverage - 50.0) / 50.0)
                  - ((game.defense.get_player('FS', 1).coverage - 50.0) / 50.0)
                  + random_variability()))),
            (game.offense.get_player('TE', 1),
             int((game.offense.get_player('TE', 1).catching * 3.05
                  - lb_coverage / 50.0
                  - ((game.offense.gameplan.o_aggression - 50.0) / 50.0)
                  + game.offense.get_player('TE', 1).speed / 2.0
                  + random_variability())))
        ]

        receiver = random_weighted_choice(weighted_choices)
    else:
        weighted_choices = [
            (game.offense.get_player('TE', 1), int((game.offense.get_player('TE', 1).catching * 1.5) + 1)),
            (game.offense.get_player('RB', 1), game.offense.get_player('RB', 1).catching),
            (game.offense.get_player('RB', 2), game.offense.get_player('RB', 2).catching),
            (game.offense.get_player('FB', 1), game.offense.get_player('FB', 1).catching)
        ]

        receiver = random_weighted_choice(weighted_choices)

        if receiver is game.offense.get_player('RB', 1):
            weighted_choices = [
                (game.offense.get_player('RB', 1),
                 game.offense.get_player('RB', 1).catching * 2
                 + game.offense.get_player('RB', 2).catching * 2 + 1),
                (game.offense.get_player('FB', 1),
                 int(game.offense.get_player('FB', 1).catching / 2 + 1))
            ]

            receiver = random_weighted_choice(weighted_choices)

            if receiver is game.offense.get_player('RB', 1):
                weighted_choices = [
                    (game.offense.get_player('RB', 1),
                     game.offense.get_player('RB', 1).catching * 2 + 1),
                    (game.offense.get_player('RB', 2),
                     game.offense.get_player('RB', 2).catching * 2 + 1)
                ]

                receiver = random_weighted_choice(weighted_choices)

    if pass_type is 4:
        weighted_choices = [
            (game.offense.get_player('RB', 1),
             game.offense.get_player('RB', 1) * 2 + 1),
            (game.offense.get_player('RB', 2),
             game.offense.get_player('RB', 2) * 2 + 1)
        ]

        receiver = random_weighted_choice(weighted_choices)

    break_stat = 50

    if receiver is game.offense.get_player('WR', 1):
        break_stat = receiver.acceleration

        if random_chance(105 - receiver.acceleration):
            check_down = True
    elif receiver is game.offense.get_player('WR', 2):
        break_stat = receiver.acceleration

        if random_chance(105 - receiver.acceleration):
            check_down = True
    elif receiver is game.offense.get_player('WR', 3):
        break_stat = receiver.acceleration

        if random_chance(105 - receiver.acceleration):
            check_down = True
    elif receiver is game.offense.get_player('TE', 1):
        break_stat = receiver.speed

        if random_chance(105 - receiver.speed / 1.5 + random_variability()):
            check_down = True
    elif receiver is game.offense.get_player('RB', 1) or game.offense.get_player('RB', 2):
        break_stat = receiver.agility

        if random_chance(105 - receiver.agility / 1.75 + random_variability()):
            check_down = True
    elif receiver is game.offense.get_player('FB', 1):
        break_stat = receiver.break_tackle

        if random_chance(105 - receiver.speed / 2.0 + random_variability()):
            check_down = True

    pass_mod = random.randint(-3, 3)

    if check_down:
        max_gain = (1.0
                    + (4.0 * (receiver.speed / 100.0))
                    - (0.25 * (game.defense.get_player('LCB', 1).tackling / 100.0))
                    - (0.25 * (game.defense.get_player('RCB', 1).tackling / 100.0))
                    - (0.25 * (game.defense.get_player('SS', 1).tackling / 100.0))
                    - (0.25 * (game.defense.get_player('FS', 1).tackling / 100.0))
                    + (1.0 * ((game.offense.gameplan.o_aggression - (100 - game.defense.gameplan.d_aggression)) / 100.0))
                    - (1.0 * (100 - game.defense.gameplan.d_run) / 100.0)
                    + pass_mod
                    + random_variability())

        while not random_chance(game.defense.get_player('SS', 1).tackling + 1)\
            and not random_chance(game.defense.get_player('FS', 1).tackling + 1)\
                and (max_gain < 200):
            max_gain += 0.25
    else:
        max_gain = (2.0
                    + (12.0 * (receiver.speed / 100.0))
                    - (0.5 * (game.defense.get_player('LCB', 1).tackling / 100.0))
                    - (0.5 * (game.defense.get_player('RCB', 1).tackling / 100.0))
                    - (0.5 * (game.defense.get_player('SS', 1).tackling / 100.0))
                    - (0.5 * (game.defense.get_player('FS', 1).tackling / 100.0))
                    + (1.0 * ((game.offense.gameplan.o_aggression - (100 - game.defense.gameplan.d_aggression)) / 100.0))
                    - (1.0 * (100 - game.defense.gameplan.d_run) / 100.0) + pass_mod + random_variability())

        while not random_chance(game.defense.get_player('SS', 1).tackling + 1)\
            and not random_chance(game.defense.get_player('FS', 1).tackling + 1)\
                and (max_gain < 200):
            max_gain += 0.5

    if max_gain < 0:
        max_gain = 0

    gain += random.randint(0, int(max_gain))

    break_free = (break_stat / 2.5 + random.randint(-5, 5) + random_variability())

    if check_down:
        break_free = (break_stat / 5.0 + random.randint(-5, 5) + random_variability())

    if break_free < 15:
        break_free = 15

    num_free = 0

    while random_chance(break_free + (10 * num_free)) and gain <= 100:
        max_gain = (2.5
                    + (22.5 * (receiver.speed / 100.0))
                    - (3.5 * (game.defense.get_player('LCB', 1).tackling / 100.0))
                    - (3.5 * (game.defense.get_player('RCB', 1).tackling / 100.0))
                    - (5.5 * (game.defense.get_player('SS', 1).tackling / 100.0))
                    - (5.5 * (game.defense.get_player('FS', 1).tackling / 100.0))
                    + (2.0 * game.play_mod)
                    + (0.25 * (game.offense.team_mod - game.defense.team_mod))
                    + (0.25 * (game.offense.gameplan.o_aggression / 100.0))
                    + random_variability())

        if max_gain < 1:
            max_gain = 1

        gain += random.randint(0, int(max_gain))

        if random_chance(receiver.speed / 1.5 + random_variability()):
            num_free += 1

        if (break_free + (10 * num_free)) > 100:
            gain = 101

    if gain < -2:
        gain = -2

    td = 0

    fumble = False

    if gain >= game.yard_line:
        gain = game.yard_line
        td = 1
    else:
        td = 0

        fum_chance = ((1.55 * receiver.concentration)
                      - (0.1 * game.defense.get_player('LCB', 1).tackling)
                      - (0.1 * game.defense.get_player('RCB', 1).tackling)
                      - (0.15 * game.defense.get_player('SS', 1).tackling)
                      - (0.15 * game.defense.get_player('FS', 1).tackling)
                      + (0.2 * (((100 - game.offense.gameplan.o_aggression)
                                 - game.defense.gameplan.d_aggression))) + random_variability())

        if fum_chance < 5:
            fum_chance = 5

        if int(random.uniform(0, int(fum_chance))) == 0:
            if (game.yard_line - gain) < 100:
                fumble = True

    fumble_forcer = game.defense.get_player('RDE', 1)

    if fumble:
        if ((gain < 10) and random_chance(95)) or random_chance(5):
            if game.defense.gameplan.d_style is '43':
                choices = [
                    (game.defense.get_player('LOLB', 1), game.defense.get_player('LOLB', 1).tackling + 1),
                    (game.defense.get_player('MLB', 1), game.defense.get_player('MLB', 1).tackling + 1),
                    (game.defense.get_player('ROLB', 1), game.defense.get_player('ROLB', 1).tackling + 1),
                    (game.defense.get_player('LCB', 1), game.defense.get_player('LCB', 1).tackling * 2
                     - game.defense.get_player('LCB', 1).coverage + 1),
                    (game.defense.get_player('LCB', 2), game.defense.get_player('LCB', 2).tackling * 2
                     - game.defense.get_player('LCB', 2).coverage + 1)
                ]
                fumble_forcer = random_weighted_choice(choices)
            else:
                choices = [
                    (game.defense.get_player('LOLB', 1), game.defense.get_player('LOLB', 1).tackling + 1),
                    (game.defense.get_player('LILB', 1), game.defense.get_player('LILB', 1).tackling + 1),
                    (game.defense.get_player('RILB', 1), game.defense.get_player('RILB', 1).tackling + 1),
                    (game.defense.get_player('ROLB', 1), game.defense.get_player('ROLB', 1).tackling + 1),
                    (game.defense.get_player('LCB', 1), game.defense.get_player('LCB', 1).tackling + 1),
                    (game.defense.get_player('RCB', 1), game.defense.get_player('RCB', 1).tackling + 1)
                ]
                fumble_forcer = random_weighted_choice(choices)
        else:
            choices = [
                (game.defense.get_player('LCB', 1), game.defense.get_player('LCB', 1).tackling + 1),
                (game.defense.get_player('RCB', 1), game.defense.get_player('RCB', 1).tackling + 1),
                (game.defense.get_player('SS', 1), game.defense.get_player('SS', 1).tackling + 1),
                (game.defense.get_player('FS', 1), game.defense.get_player('FS', 1).tackling + 1)
            ]
            fumble_forcer = random_weighted_choice(choices)

    return receiver.name, gain, td, fumble
Example #5
0
def execute_punt(game):
    """
    Executes a punt play
    """
    punter = game.offense.get_player('P', 1)
    returner = game.defense.get_player('KR', 1)
    punt_mod = random_in_range(-7, 7)
    max_punt = 15.0 + (45.0 * (punter.kick_power) / 100.0) + game.kick_mod + random_variability()
    min_punt = 10.0 + (35.0 * (punter.kick_power) / 100.0) + game.kick_mod + random_variability()

    #TODO implement st_mod (based on special teams blocking/coverage)
    punt = random_in_range(min_punt + punt_mod, max_punt + punt_mod) + 1

    #TODO implement great_blocking based on special teams blocking/coverage
    return_mod = random_in_range(-5, 5)

    choices = [
        (1, punter.kick_accuracy),
        (2, punter.kick_accuracy + 50 + punt_mod),
        (3, 200)
    ]
    punt_type = random_weighted_choice(choices)

    if punt >= game.yard_line - 5:
        punt_type = 1

    if punt >= game.yard_line + 5:
        punt = game.yard_line + 5

    touchback = False
    touchdown = False
    returns = 0
    net_punt = punt
    original_int = game.yard_line

    if punt_type == 1:
        game.yard_line = game.yard_line - punt
    elif punt_type == 2:
        punt = punt - random_in_range(5, 15)
        net_punt = punt
        game.yard_line = game.yard_line - punt
    else:
        return_stat = returner.agility if returner.agility > returner.concentration else returner.concentration
        min_return = 0.1 * return_stat + random_variability() + return_mod
        max_return = 0.25 * returner.speed + random_variability() + return_mod

        returns = random_in_range(min_return + return_mod, max_return + return_mod)

        #TODO if great_blocking (ln 4924)

        yl_togo = 100 - (game.yard_line - punt)
        game.yard_line = game.yard_line - punt + returns

        if game.yard_line > 99:
            touchdown = True
            returns = yl_togo
            game.yard_line = 100

    if game.yard_line < 1:
        game.yard_line = 20
        touchback = True
        net_punt = original_int - 20

    in_20 = False
    if game.yard_line < 20:
        in_20 = True

    if touchdown:
        game. defense.score += 6
        game = spend_time(10, 15, 10, False)
        game = execute_turnover(game)
        if (game.last_time < 1800
                and game.time >= 1800
                and (game.overtime is False
                     or game.offense.score == game.defense.score)):
            game = execute_kickoff(game)
    else:
        if punt_type == 3:
            game = spend_time(5, 15, 5, False)
        else:
            game = spend_time(3, 8, 3, False)
        game = execute_turnover(game)

    #TODO log play results with returns, touchdown, offense

    return game