コード例 #1
0
 def update(self, dt, events):
     if not self.collected:
         dist = mathHelpers.distance_to(self.get_pos(),
                                        Player.instance.get_pos())
         if dist < 0.5:
             Player.instance.keys += 1
             self.collected = True
             self.agent_pack_name = ""
コード例 #2
0
 def update(self, dt, events):
     if not self.collected:
         dist = mathHelpers.distance_to(self.get_pos(),
                                        Player.instance.get_pos())
         if dist < 0.5:
             levelData.Level.currentMap.num_of_collected += 1
             self.collected = True
             self.agent_pack_name = ""
コード例 #3
0
 def attack(self, target, dt):
     import random
     self.look_at(self.target, dt * 2)
     self.target.health -= dt * 30
     self.target.look_at(self, dt)
     self.target.angleY += dt * random.randint(-400, 400)
     self.target.rotate(dt * random.randint(-3, 3))
     dist_to_player = mathHelpers.distance_to(self.get_pos(),
                                              Player.instance.get_pos())
     self.play_sound(dist_to_player, "Attack", True)
コード例 #4
0
 def update(self, dt, events):
     if not self.open:
         dist = mathHelpers.distance_to(self.get_pos(),
                                        Player.instance.get_pos())
         if not self.open:
             if dist < 0.5:
                 if Player.instance.keys > 0:
                     Player.instance.keys -= 1
                     self.open = True
                     self.agent_pack_name = ""
             elif dist < 1 and Player.instance.keys == 0:
                 Player.instance.move(-Player.instance.dirX * 0.5,
                                      -Player.instance.dirY * 0.5, dt)
コード例 #5
0
    def update(self, dt, events):
        import os

        super().update(dt, events)
        if self.channel == None:
            self.channel = pygame.mixer.find_channel(True)

        if self.target is not None:
            dist_to_player = mathHelpers.distance_to(self.get_pos(),
                                                     Player.instance.get_pos())
            if isinstance(self.target,
                          Player) and dist_to_player < 3 and self.canSeePlayer:
                self.attack(self.target, dt)
            if isinstance(
                    self.target,
                    Player) and dist_to_player < 3 and not self.canSeePlayer:
                self.look_at(self.target, dt)
        if dist_to_player < 5:
            self.play_sound(dist_to_player, Enemy.enemy_status.name)
コード例 #6
0
    def update(self, dt, events):
        super().update(dt, events)
        # Status time will lower faster if there is more enemies
        # PS: Its a feature
        Enemy.enemy_status_time_left -= dt
        if Enemy.enemy_status_time_left < 0:
            Enemy.enemy_status_time_left = 0
            if Enemy.enemy_status == EnemyStatus.Alert:
                Enemy.enemy_status = EnemyStatus.Evasion
            elif Enemy.enemy_status == EnemyStatus.Evasion:
                Enemy.enemy_status = EnemyStatus.Caution
            elif Enemy.enemy_status == EnemyStatus.Caution:
                Enemy.enemy_status = EnemyStatus.Normal

            if Enemy.enemy_status != EnemyStatus.Normal:
                Enemy.reset_enemy_status_time()

        if Enemy.enemy_status == EnemyStatus.Normal:
            self.change_target(self.patrolPoint)

        if Player.instance in [x[0] for x in self.entitiesInSight]:
            self.canSeePlayer = True
            Enemy.change_enemy_status(EnemyStatus.Alert)
        else:
            self.canSeePlayer = False

        if self.canSeePlayer or Enemy.enemy_status == EnemyStatus.Alert:
            self.change_target(Player.instance)

        if Enemy.enemy_status == EnemyStatus.Evasion:
            if self.pathFindingNodesTarget != Player.instance:
                self.change_target(Player.instance)
            if self.pathFindingComplete:
                # pick random point on the map
                while len(self.pathFindingNodes) == 0:
                    random_pos = Entity(
                        levelData.Level.currentMap.pick_random_point())

                    self.change_target(random_pos)

        if Enemy.enemy_status == EnemyStatus.Caution:
            if self.pathFindingComplete:
                # pick random point on the map
                random_pos = Entity(
                    levelData.Level.currentMap.pick_random_point())
                dx, dy = mathHelpers.slope(self.get_pos(),
                                           random_pos.get_pos())
                targetDistance = math.hypot(dx, dy)
                if len(self.pathFindingNodes) == 0 or targetDistance < 1:
                    while len(
                            self.pathFindingNodes) == 0 and targetDistance < 1:
                        random_pos = Entity(
                            levelData.Level.currentMap.pick_random_point())
                        dx, dy = mathHelpers.slope(self.get_pos(),
                                                   random_pos.get_pos())
                        targetDistance = math.hypot(dx, dy)

                self.change_target(random_pos)

        if (Enemy.enemy_status == EnemyStatus.Evasion
                or Enemy.enemy_status == EnemyStatus.Alert
                or Enemy.enemy_status == EnemyStatus.Caution):
            self.FOV = self.originalFov * 1.5
            self.FOVDepth = self.originalFovDepth * 1.5
        else:
            self.FOV = self.originalFov
            self.FOVDepth = self.originalFovDepth

        if self.target is not None:
            dx, dy = mathHelpers.slope(self.get_pos(), self.target.get_pos())
            targetDistance = math.hypot(dx, dy)
            if self.pathFindingNodes is not None and len(
                    self.pathFindingNodes) > 0:
                nextStep = self.pathFindingNodes[0]

                nextPathNodeDistance = mathHelpers.distance_to(
                    self.get_pos(), nextStep)
                adjustedNextStep = (nextStep[0] + 0.5, nextStep[1] + 0.5)
                self.move_to(Entity(adjustedNextStep), dt)
                if nextPathNodeDistance < 0.1:
                    self.pathFindingNodes.pop(0)
            else:
                self.pathFindingComplete = True
                if targetDistance > 0.5:
                    self.move_to(self.target, dt)

            if isinstance(self.target, Node) and targetDistance < 0.5:
                self.timeGuarded += dt
                self.rotate(math.radians(36) * dt)

                if self.timeGuarded > 1:
                    self.change_patrol_point()