Facebook
From Little Crow, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 85
  1. unit = self.ai_data.bot.units.find_by_tag(self.ai_data.unit_tag)
  2.         if unit is None:
  3.             return py_trees.common.Status.FAILURE
  4.  
  5.         # Wybierz jednostki oraz budynki wroga, które jednostka widzi
  6.         enemy_units = self.ai_data.bot.enemy_units.filter(
  7.             lambda enemy: unit.distance_to(enemy) <= unit.sight_range and enemy.can_be_attacked
  8.         )
  9.         enemy_structures = self.ai_data.bot.enemy_structures.filter(
  10.             lambda enemy: unit.distance_to(enemy) <= unit.sight_range
  11.         )
  12.  
  13.         # Preferuj jednostki, które atakują oraz są blisko
  14.         visible_enemies = enemy_units + enemy_structures.filter(lambda enemy: enemy.can_attack)
  15.         visible_enemies.sort(key=lambda enemy: unit.distance_to(enemy))
  16.         enemies_in_range = visible_enemies.in_attack_range_of(unit, bonus_distance=unit.sight_range * 0.15)
  17.  
  18.         enemies = visible_enemies
  19.         if len(enemies_in_range) > 0:
  20.             enemies = enemies_in_range
  21.  
  22.         # Wybierz jednostkę, która jest najbardziej ranna. Jeśli wśród niebezpiecznych jednostek nikogo nie udało się
  23.         # znaleźć, zaatakuj inne, nie niebezpieczne cele.
  24.         best_target = min(enemies,
  25.                           key=lambda enemy: (enemy.health + enemy.shield) / (enemy.health_max + enemy.shield_max + self.ai_data.eps),
  26.                           default=None)
  27.         if best_target is None and enemy_structures.exists:
  28.             best_target = enemy_structures.closest_to(unit)
  29.  
  30.         if best_target is not None:
  31.             if not (unit.is_attacking and unit.order_target == best_target.tag):
  32.                 if unit.type_id == UnitTypeId.SENTRY:
  33.                     unit(AbilityId.GUARDIANSHIELD_GUARDIANSHIELD)
  34.                 unit.attack(best_target)
  35.                 return py_trees.common.Status.SUCCESS
  36.         return py_trees.common.Status.RUNNING