Example #1
0
    def _send_position(self):
        """
            Go through all events and check intersections
        """

        events = self.EVENTS['im_in_area']
        for event in events[:]:
            receiver = self.fighters[event['receiver_id']]
            distance = euclidean_distance(receiver.coordinates,
                                          event["data"]["coordinates"])
            if distance < event["data"]["radius"]:
                receiver.send_event(lookup_key=event['lookup_key'],
                                    data={
                                        ATTRIBUTE.ID: receiver.id,
                                        "distance": distance
                                    })
                events.remove(event)

        events = self.EVENTS['enemy_in_my_firing_range']
        for event in events[:]:
            receiver = self.fighters[event['receiver_id']]
            for event_item in self.battle_fighters():
                if receiver == event_item:
                    continue
                if event_item.player == receiver.player:
                    continue

                distance = euclidean_distance(receiver.coordinates,
                                              event_item.coordinates)
                if distance - event_item.size / 2 > receiver.firing_range:
                    continue

                receiver.send_event(lookup_key=event['lookup_key'],
                                    data={'id': event_item.id})
                events.remove(event)
                break

        events = self.EVENTS['any_item_in_area']
        for event in events[:]:
            receiver = self.fighters[event['receiver_id']]
            for event_item in self.battle_fighters():
                distance = euclidean_distance(event['data']['coordinates'],
                                              event_item.coordinates)
                if distance > event['data']['radius']:
                    continue

                receiver.send_event(lookup_key=event['lookup_key'],
                                    data={'id': event_item.id})
                events.remove(event)
                break
Example #2
0
 def check_function(event, event_item, receiver):
     if (receiver.id != event_item.id and
             not event_item.is_obstacle and
             event_item.player != receiver.player):
         distance = euclidean_distance(receiver.coordinates, event_item.coordinates)
         return distance - event_item.size / 2 <= receiver.firing_range
     return False
Example #3
0
    def setup(self):
        fight_handler = self._fight_handler
        fighters = fight_handler.fighters

        self.add_checker(
            'time', lambda event, receiver: fight_handler.current_game_time >=
            event['data']['time'],
            lambda event, receiver, res: {'time': event['data']['time']})

        self.add_checker(
            'idle', lambda event, receiver:
            (event['data']['id'] in fighters and fighters[event['data']['id']].
             _state.get('action') == 'idle'),
            lambda event, receiver, res: {'id': event['data']['id']})

        self.add_checker(
            'enemy_in_my_firing_range',
            self.gen_fighters_checker(lambda event_item, event, receiver: (
                euclidean_distance(receiver.coordinates, event_item.coordinates
                                   ) - event_item.size / 2 <= receiver.
                firing_range) and receiver.player_id != event_item.player_id),
            lambda event, receiver, res: {'id': res.id})

        self.add_checker(
            'death', lambda event, receiver: fighters.get(event['data'][
                'id']) and fighters.get(event['data']['id']).is_dead,
            lambda event, receiver, res: {'id': event['data']['id']})

        self.add_checker(
            'unit_landed',
            self.gen_fighters_checker(
                lambda event_item, event, receiver: event_item.fflag('landed')
                and event['data']['craft_id'] == event_item.craft_id),
            lambda event, receiver, res: res.info)
Example #4
0
    def _send_position(self):
        """
            Go through all events and check intersections
        """

        events = self.EVENTS['im_in_area']
        for event in events[:]:
            receiver = self.fighters[event['receiver_id']]
            distance = euclidean_distance(receiver.coordinates, event["data"]["coordinates"])
            if distance < event["data"]["radius"]:
                receiver.send_event(lookup_key=event['lookup_key'],
                                    data={ATTRIBUTE.ID: receiver.id, "distance": distance})
                events.remove(event)

        events = self.EVENTS['enemy_in_my_firing_range']
        for event in events[:]:
            receiver = self.fighters[event['receiver_id']]
            for event_item in self.battle_fighters():
                if receiver == event_item:
                    continue
                if event_item.player == receiver.player:
                    continue

                distance = euclidean_distance(receiver.coordinates, event_item.coordinates)
                if distance - event_item.size / 2 > receiver.firing_range:
                    continue

                receiver.send_event(lookup_key=event['lookup_key'],
                                    data={'id': event_item.id})
                events.remove(event)
                break

        events = self.EVENTS['any_item_in_area']
        for event in events[:]:
            receiver = self.fighters[event['receiver_id']]
            for event_item in self.battle_fighters():
                distance = euclidean_distance(event['data']['coordinates'], event_item.coordinates)
                if distance > event['data']['radius']:
                    continue

                receiver.send_event(lookup_key=event['lookup_key'],
                                    data={'id': event_item.id})
                events.remove(event)
                break
 def get_enemy_items_in_my_firing_range(self, item_id):
     seeker = self.fighters[item_id]
     result = []
     for other in self.fighters.values():
         if other.player == seeker.player or other.is_dead or other.is_obstacle:
             continue
         distance = euclidean_distance(other.coordinates, seeker.coordinates)
         if distance - other.size / 2 <= seeker.firing_range:
             result.append(self.get_item_info(other.id))
     return result
Example #6
0
    def validate_attack(self, action, data):
        enemy = self._fight_handler.fighters.get(data['id'])
        if enemy.is_dead:
            raise ActionValidateError("The enemy is dead")
        if enemy.player['id'] == self._item.player['id']:
            raise ActionValidateError("Can not attack own item")

        distance_to_enemy = euclidean_distance(enemy.coordinates, self._item.coordinates)
        item_firing_range = self._item.firing_range
        if distance_to_enemy - enemy.size / 2 > item_firing_range:
            raise ActionValidateError("Can not attack item, it's big distance")
Example #7
0
    def validate_attack(self, action, data):
        enemy = self._fight_handler.fighters.get(data['id'])
        if enemy.is_dead:
            raise ActionValidateError("The enemy is dead")
        if enemy.player['id'] == self._item.player['id']:
            raise ActionValidateError("Can not attack own item")

        distance_to_enemy = euclidean_distance(enemy.coordinates, self._item.coordinates)
        item_firing_range = self._item.firing_range
        if distance_to_enemy - enemy.size / 2 > item_firing_range:
            raise ActionValidateError("Can not attack item, it's big distance")
Example #8
0
    def explode(self):
        self.is_dead = True

        for item in self.item._fight_handler.fighters.values():
            if item.role != ROLE.UNIT or item == self.item:
                continue

            distance = euclidean_distance(item.coordinates, self.cur_coor)
            if distance > self.explode_radius:
                continue

            damage = (self.explode_radius - distance) * self.item.damage_per_shot
            item.get_shoted(damage)
Example #9
0
    def explode(self):
        self.is_dead = True
        for item in self.item._fight_handler.fighters.values():
            if item.player_id == self.item.player_id or not item.coordinates:
                continue

            distance = euclidean_distance(item.coordinates, self.cur_coor)
            if distance > self.explode_radius:
                continue

            damage = (self.explode_radius -
                      distance) * self.damage_per_shot / self.explode_radius
            item.get_shoted(damage)
Example #10
0
    def do_frame_action(self):
        distance = euclidean_distance(self.cur_coor, self.target_coor)
        if distance <= self.speed:
            self.cur_coor = self.target_coor
            self.explode()
            return

        def calc_single_coor(cur, target):
            return (target - cur) * self.speed / distance + cur

        self.cur_coor = [
            calc_single_coor(self.cur_coor[0], self.target_coor[0]),
            calc_single_coor(self.cur_coor[1], self.target_coor[1])
        ]
Example #11
0
    def do_frame_action(self):
        distance = euclidean_distance(self.cur_coor, self.target_coor)
        if distance <= self.speed:
            self.cur_coor = self.target_coor
            self.explode()
            return

        def calc_single_coor(cur, target):
            return (target - cur) * self.speed / distance + cur

        self.cur_coor = [
            calc_single_coor(self.cur_coor[0], self.target_coor[0]),
            calc_single_coor(self.cur_coor[1], self.target_coor[1])
        ]
Example #12
0
    def _shot(self, enemy):
        charged = self._get_charged(enemy.coordinates, enemy.id)
        if charged:
            return charged

        attacker = self._item

        if (euclidean_distance(enemy.coordinates, attacker.coordinates) -
                enemy.size / 2) <= attacker.firing_range:
            return self._actual_shot(enemy)

        if enemy.is_dead:
            return self._idle()

        return self._idle()
Example #13
0
    def _shot(self, enemy):
        charged = self._get_charged(enemy.coordinates, enemy.id)
        if charged:
            return charged

        attacker = self._item

        if (euclidean_distance(enemy.coordinates, attacker.coordinates) -
                enemy.size / 2) <= attacker.firing_range:
            return self._actual_shot(enemy)

        if enemy.is_dead:
            return self._idle()

        return self._idle()
    def get_nearest_enemy(self, item_id):
        min_length = 1000
        nearest_enemy = None

        fighter = self.fighters[item_id]

        for item in self.fighters.values():
            if item.player == fighter.player or item.is_dead or item.is_obstacle:
                continue

            length = euclidean_distance(item.coordinates, fighter.coordinates)

            if length < min_length:
                min_length = length
                nearest_enemy = item
        return self.get_item_info(nearest_enemy.id)
Example #15
0
    def do_frame_action(self):
        for item in self.item._fight_handler.fighters.values():
            if not item.coordinates or (
                    item.player_id == self.item.player_id
                    and not self.is_support
            ) or (item.player_id != self.item.player_id and self.is_support):
                continue

            distance = euclidean_distance(item.coordinates, self.coor)
            if distance > self.radius:
                continue

            self.act(item, self.power)

        self.timer -= self.item._fight_handler.GAME_FRAME_TIME
        if self.timer <= 0:
            self.is_dead = True
Example #16
0
    def explode():
        self.is_dead = True
        for item in self._fight_handler.fighters.values():
            if item.is_dead:
                continue

            if item.player_id == self.item.player_id:
                continue

            if item.role != ROLE.UNIT:
                continue

            distance = euclidean_distance(item.coordinates, self.coordinates)
            if distance > self.firing_range:
                continue

            damage = (self.firing_range -
                      distance) * self.damage_per_shot / self.firing_range
            item.get_shoted(damage)
Example #17
0
 def check_function(event, event_item, receiver):
     distance = euclidean_distance(event['data']['coordinates'], event_item.coordinates)
     return distance <= event['data']['radius']
Example #18
0
 def check_function(event, event_item, receiver):
     if event["data"]["item_id"] == event_item.id:
         distance = euclidean_distance(receiver.coordinates, event_item.coordinates)
         return distance - event_item.size / 2 > receiver.firing_range
     return False
Example #19
0
 def data_function(event, event_item, receiver):
     distance = euclidean_distance(receiver.coordinates, event["data"]["coordinates"])
     return {ATTRIBUTE.ID: event_item.id, "distance": distance}
Example #20
0
 def check_function(event, event_item, receiver):
     if receiver.id == event_item.id:
         distance = euclidean_distance(receiver.coordinates, event["data"]["coordinates"])
         return distance < event["data"]["radius"]
     return False