def update(self, mario, goombas, stats, settings):
        self.check_collisions(mario, goombas, stats, settings)

        if self.status == "Dying":
            if pygame.time.get_ticks(
            ) - self.killed_time > self.killed_delay_time:  # If enough time has passed since the enemy was killed
                self.status = "DisplayingScore"  # Show the enemy's point value

        if self.status == "DisplayingScore":
            self.rect.y -= 5
            if pygame.time.get_ticks(
            ) - self.killed_time > 1000:  # If enough time has passed since the score began displaying
                goombas.remove(
                    self)  # Remove the score and the enemy simultaneously

        if self.gamemap.object_touching_wall(self):
            self.speed *= -1

        # Walking
        self.rect.x += 1 * self.speed

        # Perform gravity
        if not self.gamemap.object_touching_ground(self):
            Gravity.perform(self)

        self.animate()
        self.blitme()
class Mario(Sprite):
    SPEED_CAP = 4  # Prevents extreme speed
    ACCEL_FACTOR = 0.025
    DECEL_FACTOR = 0.25
    FALL_FACTOR = 0.20
    TURN_FACTOR = 0.3

    def __init__(self, screen, settings, gamemap):
        super(Mario, self).__init__()
        self.screen = screen
        self.screen_rect = self.screen.get_rect()
        self.settings = settings
        self.gravity = Gravity()
        self.gamemap = gamemap
        self.image = pygame.image.load("media/images/mario/standing.png")
        self.image = pygame.transform.scale(self.image, (35, 50))
        self.rect = self.image.get_rect()
        self.dist = 0
        self.speed = 0
        self.dir = 1  # -1 = moving left, 0 = standing still, 1 = moving right
        self.moving_right = False
        self.moving_left = False
        self.jumping = False
        self.jump_finished = False
        self.jump_speed = 0
        self.jump_start = False
        self.last_img_update = pygame.time.get_ticks()
        self.last_img_mode = 1

    def __str__(self):
        return 'Mario: x:' + str(self.rect.x) + ' y:' + str(self.rect.y)

    def update(self, gamemap, stats):  # Update and then blit

        if self.rect.top > self.screen_rect.bottom + 80:  # Has Mario fallen offscreen?
            stats.decrement_lives()
            self.settings.game_active = False
            self.settings.game_status = "Reset"
            return

        if not self.jumping and not gamemap.object_touching_ground(self):
            self.gravity.perform(self)

        if self.jumping:
            if gamemap.object_touching_ground(self):
                audio.play(0)
            self.jump()
        elif self.jumping and gamemap.object_touching_ground(self):
            self.jump()
        elif self.gamemap.object_touching_ground:
            self.jump_start = False
            self.jump_speed = 0
        if self.moving_left:
            if self.dir == 1 and self.speed != 0:
                self.turn()
            elif self.dir == 0:
                self.dir = -1
            self.accelerate()
            if self.rect.x > 0:
                self.rect.x += self.dir * self.speed

        elif self.moving_right:
            if self.dir == -1 and self.speed != 0:
                self.turn()
            elif self.dir == 0:
                self.dir = 1
            self.accelerate()
            if self.rect.centerx >= self.screen_rect.width / 2:
                self.gamemap.scroll(self.speed)
            else:
                self.rect.x += self.dir * self.speed
        else:
            self.decelerate()
            if self.rect.x > 0 and self.rect.right < self.screen_rect.width:
                self.rect.x += self.dir * self.speed
            if self.rect.centerx >= self.screen_rect.width / 2:
                self.gamemap.scroll(self.speed)

        self.rect.y -= self.jump_speed
        self.gamemap.collide(self)
        self.animate()
        self.blitme()

    def animate(self):
        if pygame.time.get_ticks() - self.last_img_update >= 50:
            if self.jumping:
                img_string = "media/images/mario/jumping_1.png"
                self.image = pygame.image.load(img_string)
                self.image = pygame.transform.scale(self.image, (35, 50))
                if self.dir == -1:
                    self.image = pygame.transform.flip(self.image, 1, 0)
            elif self.moving_right or self.moving_left:
                if self.gamemap.object_touching_ground:
                    img_string = "media/images/mario/walking_" + str(
                        self.last_img_mode) + ".png"
                    self.image = pygame.image.load(img_string)
                    self.image = pygame.transform.scale(self.image, (35, 50))
                    if self.dir == -1:
                        self.image = pygame.transform.flip(self.image, 1, 0)

            else:
                img_string = "media/images/mario/standing.png"
                self.image = pygame.image.load(img_string)
                self.image = pygame.transform.scale(self.image, (35, 50))
                if self.dir == -1:
                    self.image = pygame.transform.flip(self.image, 1, 0)

            if self.last_img_mode == 4:
                self.last_img_mode = 1
            else:
                self.last_img_mode += 1
            self.last_img_update = pygame.time.get_ticks()

    def accelerate(self):
        if self.speed == 0:
            self.speed = 2 + Mario.ACCEL_FACTOR
        if self.speed < Mario.SPEED_CAP:
            self.speed *= 1 + Mario.ACCEL_FACTOR

    def decelerate(self):
        if self.speed >= Mario.ACCEL_FACTOR:
            self.speed -= Mario.DECEL_FACTOR
        else:
            self.speed = 0
            self.dir = 0

    def turn(self):
        if self.speed >= Mario.ACCEL_FACTOR:
            self.speed -= Mario.TURN_FACTOR
        else:
            self.speed = 0
            self.dir *= -1

    def jump(self):
        if not self.jump_finished:
            self.jump_start = True
            if self.jump_speed <= 0:
                self.jump_speed = 7
            else:
                self.jump_speed -= Mario.FALL_FACTOR
                if self.jump_speed <= 0:
                    self.jump_finished = True
                elif self.gamemap.object_touching_ground(self):
                    self.jump_finished = True

        else:
            self.jump_speed -= Mario.FALL_FACTOR
            if self.gamemap.object_touching_ground(self):
                self.jump_finished = False
                self.jump_start = False

    def blitme(self):  # Blit Mario
        self.screen.blit(self.image, self.rect)