def ai(self, target, time): #Force death when health reaches 0 if self.health <= 0: self.image = self.died #Do nothing when target is dead if (target.health <= 0 or target.on_stun == True) and self.health > 0 and self.on_damage == False and self.on_attack == False and self.on_stun == False: self.doing_nothing = True if self.look_right: self.breathing_right.play() self.image = self.breathing_right.get_current_image() else: self.breathing_left.play() self.image = self.breathing_left.get_current_image() #Move elif self.health > 0 and self.on_damage == False and self.on_cover == False and self.on_attack == False and self.on_stun == False and target.on_stun == False: self.doing_nothing = False if (self.rect.centerx < target.rect.centerx and target.look_left == True) or (self.rect.centerx > target.rect.centerx and target.look_right == True): self.on_locked = True else: self.on_locked = False in_advantage = abs(self.rect.centerx - target.rect.centerx) > 230 #Make decition if self.pose == "crafty": decition = Pose.crafty([self.on_locked, target.on_attack, target.on_cover, target.on_air, in_advantage]) elif self.pose == "coward": decition = Pose.coward([self.on_locked, target.on_attack, target.on_cover, target.on_air, in_advantage]) elif self.pose == "aggressive": decition = Pose.aggressive([self.on_locked, target.on_attack, target.on_cover, target.on_air, in_advantage]) if decition == 1: #Reach target #Up if self.rect.bottom>(self.HEIGHT - 70): if self.rect.centery > target.rect.centery: if self.look_right: self.looking_right.play() self.image = self.looking_right.get_current_image() elif self.look_left: self.looking_left.play() self.image = self.looking_left.get_current_image() self.rect.centery -= self.speed_x * time #Down if self.rect.bottom<self.HEIGHT: if self.rect.centery < target.rect.centery: if self.look_right: self.looking_right.play() self.image = self.looking_right.get_current_image() elif self.look_left: self.looking_left.play() self.image = self.looking_left.get_current_image() self.rect.centery += self.speed_x * time #Right if self.rect.right<self.WIDTH: if target.rect.centerx>self.rect.centerx: self.look_left = False self.look_right = True self.looking_right.play() self.image = self.looking_right.get_current_image() self.rect.centerx += self.speed_x * time #Left if self.rect.left>0: if target.rect.centerx<self.rect.centerx: self.look_left = True self.look_right = False self.looking_left.play() self.image = self.looking_left.get_current_image() self.rect.centerx -= self.speed_x * time #Attack if target.health > 0: if self.ready2attack: #Close if abs(self.rect.centerx - target.rect.centerx) < 80: self.power = self.sword_power self.swoosh.get_sfx().play() if self.look_right: self.image = self.attacking_right else: self.image = self.attacking_left self.on_cover = False self.attack_duration = 10 self.ready2attack = False self.reload_time = 30 self.on_attack = True #Far if abs(self.rect.centerx - target.rect.centerx) < self.rifle_range: if abs(self.rect.centerx - target.rect.centerx) > 230: self.power = self.rifle_power + (-1 * (abs(int(self.rect.centerx - target.rect.centerx)/100))) self.shot.get_sfx().play() if target.rect.centerx > self.rect.centerx: self.look_right = True self.look_left = False self.image = self.attacking_right_far else: self.look_right = False self.look_left = True self.image = self.attacking_left_far self.on_cover = False self.attack_duration = 30 self.ready2attack = False self.reload_time = 70 self.on_attack = True elif decition == -1: #Retreat if target.health > 0: #Attack when in range if self.ready2attack == True and (abs(self.rect.centerx - target.rect.centerx) < self.rifle_range and abs(self.rect.centerx - target.rect.centerx) > 230): self.power = self.rifle_power + (-1 * (abs(int(self.rect.centerx - target.rect.centerx)/100))) self.shot.get_sfx().play() if target.rect.centerx > self.rect.centerx: self.look_right = True self.look_left = False self.image = self.attacking_right_far else: self.look_right = False self.look_left = True self.image = self.attacking_left_far self.on_cover = False self.attack_duration = 10 self.ready2attack = False self.reload_time = 70 self.on_attack = True #Close attack elif self.ready2attack == True and abs(self.rect.centerx - target.rect.centerx) < 30: self.power = self.sword_power self.swoosh.get_sfx().play() if self.look_right: self.image = self.attacking_right else: self.image = self.attacking_left self.on_cover = False self.attack_duration = 10 self.ready2attack = False self.reload_time = 30 self.on_attack = True #Go away if not else: #Up if self.rect.bottom>(self.HEIGHT - 70): if self.rect.centery < target.rect.centery: if self.look_right: self.looking_right.play() self.image = self.looking_right.get_current_image() elif self.look_left: self.looking_left.play() self.image = self.looking_left.get_current_image() self.rect.centery -= self.speed_x * time #Down if self.rect.bottom<self.HEIGHT: if self.rect.centery > target.rect.centery: if self.look_right: self.looking_right.play() self.image = self.looking_right.get_current_image() elif self.look_left: self.looking_left.play() self.image = self.looking_left.get_current_image() self.rect.centery += self.speed_x * time #Right if self.rect.right<self.WIDTH: if target.rect.centerx<self.rect.centerx: self.look_left = False self.look_right = True self.looking_right.play() self.image = self.looking_right.get_current_image() self.rect.centerx += self.speed_x * time #Left if self.rect.left>0: if target.rect.centerx>self.rect.centerx: self.look_left = True self.look_right = False self.looking_left.play() self.image = self.looking_left.get_current_image() self.rect.centerx -= self.speed_x * time