Ejemplo n.º 1
0
    def update(self, elapsed):
        if not self.is_ready():
            self.remaining_cooldown = max(0, self.remaining_cooldown - elapsed)
            return

        # If the trap should be triggered by creatures, search for them along with players.
        if self.spell_id in TrapManager.TRIGGERED_BY_CREATURES:
            surrounding_creatures, surrounding_players = MapManager.get_surrounding_units_by_location(
                self.trap_object.location,
                self.trap_object.map_,
                self.radius,
                include_players=True)
            surrounding_units = surrounding_creatures | surrounding_players
        else:
            # This trap can only be triggered by players.
            surrounding_units = MapManager.get_surrounding_players_by_location(
                self.trap_object.location, self.trap_object.map_, self.radius)

        for unit in surrounding_units.values():
            # Keep looping until we find a valid unit.
            if not self.trap_object.can_attack_target(unit):
                continue

            # Valid target found, trigger the trap. In case charges = 1, despawn the trap.
            if self.trigger(unit) and self.charges == 1:
                self.trap_object.set_active()
                self.trap_object.despawn()
            break
Ejemplo n.º 2
0
    def resolve_all_friendly_in_area(casting_spell, target_effect):
        target = casting_spell.initial_target
        if not casting_spell.initial_target_is_terrain():
            return []
        map_ = casting_spell.spell_caster.map_
        result = MapManager.get_surrounding_units_by_location(
            target, map_, target_effect.get_radius(), True)

        merged = list(result[0].values()) + list(result[1].values())
        return EffectTargets.get_friends_from_unit_list(
            merged, casting_spell.spell_caster)
Ejemplo n.º 3
0
    def resolve_all_enemy_in_area_instant(casting_spell, target_effect):
        caster = casting_spell.spell_caster
        map_ = casting_spell.spell_caster.map_
        radius = target_effect.get_radius()
        if casting_spell.initial_target_is_terrain():
            effect_source = casting_spell.initial_target
            result = MapManager.get_surrounding_units_by_location(
                effect_source, map_, radius, True)  # Ground-targeted AoE.
            merged = list(result[0].values()) + list(result[1].values())
        else:
            # TODO len(target_effect.targets.resolved_targets_a) == 1 incorrectly resolves to a single target of an AoE spell.
            effect_source = target_effect.targets.resolved_targets_a[0] if len(
                target_effect.targets.resolved_targets_a) == 1 else caster
            target_effect.targets.effect_source = effect_source

            result = MapManager.get_surrounding_units(
                effect_source,
                include_players=True)  # Unit-targeted AoE - explosive shot.
            merged = list(result[0].values()) + list(result[1].values())
            merged = [
                target for target in merged
                if target.location.distance(effect_source.location) <= radius
            ]  # Select targets in range.

        enemies = EffectTargets.get_enemies_from_unit_list(
            merged, casting_spell.spell_caster)
        if isinstance(effect_source,
                      ObjectManager) and effect_source in enemies:
            enemies.remove(
                effect_source
            )  # Effect source shouldn't be included in final targets.

        for enemy in enemies:
            # Write to impact timestamps to indicate that this target should be instant.
            # See SpellManager.calculate_impact_delays
            casting_spell.spell_impact_timestamps[enemy.guid] = -1

        if len(enemies) == 0 and len(
                target_effect.targets.resolved_targets_a) > 0:
            target_effect.targets.resolved_targets_a = [
            ]  # As this target specifies on A in some cases, clear out A if no targets exist.
        return enemies