Exemple #1
0
    def __init__(self, game):
        super(RemoteTreasureBot, self).__init__(game)

        self.stealBot = RemoteStealBot(game)

        # Главная функция
        self.action = self.remote_treasure

        # Объекты под которыми не ищем клады
        self.denied_dig_types = self.get_params().exclude_treasure_dig_types

        self.all_digged = False
Exemple #2
0
    def __init__(self, game):
        super(RemoteDiggerBot, self).__init__(game)

        self.stealBot = RemoteStealBot(game)

        # Главная функция
        self.action = self.remote_dig

        # Приоритеты для выкапывания
        self.dig_priorities = self.get_game().arg_params.get('dig_priorities')

        # Копать только под достроенной постройкой
        self.only_build_complete = False
Exemple #3
0
    def __init__(self, game):
        super(RemoteTreasureBot, self).__init__(game)

        self.stealBot = RemoteStealBot(game)

        # Главная функция
        self.action = self.remote_treasure

        # Объекты под которыми не ищем клады
        self.denied_dig_types = self.get_params().exclude_treasure_dig_types

        self.all_digged = False
Exemple #4
0
    def get_presets(self):
        single_bots = [
            RemotePlayersBot(self.get_game())
        ]

        actions = {
            0: RemoteNewYearTreeBot(self.get_game()),
            1: RemoteFertilizeBot(self.get_game()),
            2: RemoteDiggerBot(self.get_game()),
            3: RemoteStealBot(self.get_game()),
            4: RemoteTreasureBot(self.get_game()),
            5: RemoteTraderBot(self.get_game()),
            6: RemoteKnockBot(self.get_game())
        }

        event_handler = RemoteEventHandler(self.get_game())

        circle_bots = [
            RemoteLocationBot(self.get_game())
        ]
        circle_bots.insert(1, actions.get(self.remote_scenary))

        return single_bots, circle_bots, event_handler
Exemple #5
0
class RemoteDiggerBot(RemoteBot):

    def __init__(self, game):
        super(RemoteDiggerBot, self).__init__(game)

        self.stealBot = RemoteStealBot(game)

        # Главная функция
        self.action = self.remote_dig

        # Приоритеты для выкапывания
        self.dig_priorities = self.get_game().arg_params.get('dig_priorities')

        # Копать только под достроенной постройкой
        self.only_build_complete = False

    def remote_dig(self, event_to_handle):

        # Крадем мешочки по ходу жизни
        self.stealBot.remote_pick(event_to_handle)

        remote_game_objects = event_to_handle.gameObjects

        if event_to_handle.haveTreasure:
            target_dict = {}
            success = False

            finded = []

            for go in remote_game_objects:
                for target in self.dig_priorities:
                    if go.item in self.get_params().dig_items.get(target):
                        # Если это постройка, то он должен быть построен(опция)
                        if u'building' in go.type and self.only_build_complete:
                            if go.level < len(self.get_item_reader().get(go.item).upgrades):
                                continue
                        res = target_dict.get(target, [])
                        res.append(go)
                        target_dict[target] = res
                        success = True

                        name = self.get_item_reader().get(go.item).name
                        finded.append(name)
                        break

            if success:
                logger.info(u'Найдено: %s' % u', '.join(finded))
                for priority in self.dig_priorities:
                    dig_objects = target_dict.get(priority)
                    if dig_objects:
                        shovel_storage_count = self.get_game_state().count_storage(u'@SHOVEL_EXTRA')
                        shovel = 300 if shovel_storage_count >= 300 else shovel_storage_count
                        if not shovel:
                            logger.info(u'Закончились супер-лопаты на складе')
                            self.get_game_state().set_remote_stop(True)
                            return
                        go = random.choice(dig_objects)
                        name = self.get_item_reader().get(go.item).name
                        evts = []
                        logger.info(u'Пробуем копать под %s' % name)
                        while shovel > 0:
                            dig_event = GameRemoteDigItem(objId=go.id, x=go.x, y=go.y)
                            response_events = self.get_events_sender().send_game_events([dig_event])
                            response_events += self.get_events_sender().send_game_events([dig_event] * 9)
                            shovel -= 10

                            evts = [x for x in response_events
                                    if x.type == u'alert' and x.msg == u'SERVER_REMOTE_TREASURE_ALL_DIGGED']

                            for alert_evt in evts:
                                self.get_events_sender().remove_game_event(alert_evt)

                            if evts:
                                break

                        if evts:
                            response_events = self.get_events_sender().send_game_events()
                            evts += [x for x in response_events
                                     if x.type == u'alert' and x.msg == u'SERVER_REMOTE_TREASURE_ALL_DIGGED']

                            for alert_evt in evts:
                                self.get_events_sender().remove_game_event(alert_evt)

                            logger.info(u'Использовано %i лопат' % (300 - shovel - len(evts)))
                            return

                        logger.info(u'Использовано %i лопат' % 300)
                        return
        else:
            logger.info(u'У игрока уже все выкопано')
Exemple #6
0
class RemoteTreasureBot(RemoteBot):

    def __init__(self, game):
        super(RemoteTreasureBot, self).__init__(game)

        self.stealBot = RemoteStealBot(game)

        # Главная функция
        self.action = self.remote_treasure

        # Объекты под которыми не ищем клады
        self.denied_dig_types = self.get_params().exclude_treasure_dig_types

        self.all_digged = False

    def dig_object(self, go):
        remote_dig = GameRemoteDigItem(objId=go.id, x=go.x, y=go.y)
        response_events = self.get_events_sender().send_game_events([remote_dig])

        for event in response_events:
            if event.type == u'alert':
                if event.msg == u'SERVER_TREASURE_FOUND':
                    return True
                elif event.msg == u'SERVER_REMOTE_TREASURE_ALL_DIGGED':
                    self.all_digged = True
        return False

    def remote_treasure(self, event_to_handle):

        self.all_digged = False
        remote_game_objects = event_to_handle.gameObjects

        # Крадем мешочки по ходу жизни
        self.stealBot.remote_pick(event_to_handle)

        # Не копнули ни разу
        dig_count = 0

        if event_to_handle.haveTreasure:
            # получили список объектов где будем рыть
            allow_objects = [x for x in remote_game_objects if x.type not in self.denied_dig_types]
            for go in allow_objects:
                # при переходе к следущему объекту проверяем лимит на копку
                # или что все уже выкопано
                if dig_count == 300 or self.all_digged:
                    break

                go_obj = self.get_item_reader().get(go.item)
                logger.info(u'Пробуем копать под %s %i (%i, %i)' % (go_obj.name, go.id, go.x, go.y))

                # найдено кладов
                treasure_count = 0

                # копнув, проверяем выпали ли сокровица
                found_treasure = self.dig_object(go)

                # увеличиваем счетчик найденых под объектом кладов на 1
                if found_treasure:
                    treasure_count += 1

                # увеличиваем счетчик лопат на 1
                dig_count += 1
                # если лимит на копку, выходим
                if dig_count == 300 or self.all_digged:
                    # если нашли клады но кончились лопатки показываем сколько накопали кладов
                    if treasure_count:
                        logger.info(u'Найдено %i кладов под %s %i (%i, %i)' %
                                    (treasure_count, go_obj.name, go.id, go.x, go.y))
                    break

                # если выпали сокровища роем там дальше
                while found_treasure:
                    # копнув, проверяем выпали ли сокровица
                    found_treasure = self.dig_object(go)

                    # увеличиваем счетчик найденых под объектом кладов на 1
                    if found_treasure:
                        treasure_count += 1

                    # увеличиваем счетчик лопат на 1
                    dig_count += 1
                    # если лимит на копку, выходим
                    if dig_count == 300 or self.all_digged:
                        # если нашли клады но кончились лопатки показываем сколько накопали кладов
                        if treasure_count:
                            logger.info(u'Найдено %i кладов под %s %i (%i, %i)' %
                                        (treasure_count, go_obj.name, go.id, go.x, go.y))
                        break

                # если нашли клады показываем сколько накопали кладов
                if treasure_count:
                    logger.info(u'Найдено %i кладов под %s %i (%i, %i)' %
                                (treasure_count, go_obj.name, go.id, go.x, go.y))

            if allow_objects:
                logger.info(u'Использовали %i лопат' % dig_count)
Exemple #7
0
class RemoteTreasureBot(RemoteBot):
    def __init__(self, game):
        super(RemoteTreasureBot, self).__init__(game)

        self.stealBot = RemoteStealBot(game)

        # Главная функция
        self.action = self.remote_treasure

        # Объекты под которыми не ищем клады
        self.denied_dig_types = self.get_params().exclude_treasure_dig_types

        self.all_digged = False

    def dig_object(self, go):
        remote_dig = GameRemoteDigItem(objId=go.id, x=go.x, y=go.y)
        response_events = self.get_events_sender().send_game_events(
            [remote_dig])

        for event in response_events:
            if event.type == u'alert':
                if event.msg == u'SERVER_TREASURE_FOUND':
                    return True
                elif event.msg == u'SERVER_REMOTE_TREASURE_ALL_DIGGED':
                    self.all_digged = True
        return False

    def remote_treasure(self, event_to_handle):

        self.all_digged = False
        remote_game_objects = event_to_handle.gameObjects

        # Крадем мешочки по ходу жизни
        self.stealBot.remote_pick(event_to_handle)

        # Не копнули ни разу
        dig_count = 0

        if event_to_handle.haveTreasure:
            # получили список объектов где будем рыть
            allow_objects = [
                x for x in remote_game_objects
                if x.type not in self.denied_dig_types
            ]
            for go in allow_objects:
                # при переходе к следущему объекту проверяем лимит на копку
                # или что все уже выкопано
                if dig_count == 300 or self.all_digged:
                    break

                go_obj = self.get_item_reader().get(go.item)
                logger.info(u'Пробуем копать под %s %i (%i, %i)' %
                            (go_obj.name, go.id, go.x, go.y))

                # найдено кладов
                treasure_count = 0

                # копнув, проверяем выпали ли сокровица
                found_treasure = self.dig_object(go)

                # увеличиваем счетчик найденых под объектом кладов на 1
                if found_treasure:
                    treasure_count += 1

                # увеличиваем счетчик лопат на 1
                dig_count += 1
                # если лимит на копку, выходим
                if dig_count == 300 or self.all_digged:
                    # если нашли клады но кончились лопатки показываем сколько накопали кладов
                    if treasure_count:
                        logger.info(
                            u'Найдено %i кладов под %s %i (%i, %i)' %
                            (treasure_count, go_obj.name, go.id, go.x, go.y))
                    break

                # если выпали сокровища роем там дальше
                while found_treasure:
                    # копнув, проверяем выпали ли сокровица
                    found_treasure = self.dig_object(go)

                    # увеличиваем счетчик найденых под объектом кладов на 1
                    if found_treasure:
                        treasure_count += 1

                    # увеличиваем счетчик лопат на 1
                    dig_count += 1
                    # если лимит на копку, выходим
                    if dig_count == 300 or self.all_digged:
                        # если нашли клады но кончились лопатки показываем сколько накопали кладов
                        if treasure_count:
                            logger.info(
                                u'Найдено %i кладов под %s %i (%i, %i)' %
                                (treasure_count, go_obj.name, go.id, go.x,
                                 go.y))
                        break

                # если нашли клады показываем сколько накопали кладов
                if treasure_count:
                    logger.info(
                        u'Найдено %i кладов под %s %i (%i, %i)' %
                        (treasure_count, go_obj.name, go.id, go.x, go.y))

            if allow_objects:
                logger.info(u'Использовали %i лопат' % dig_count)