Example #1
0
    def gain_material_event(self, event):

        go = self.get_game_state().get_object_by_id(event.objId)
        if not go:
            return

        if go.doneCounter != event.doneCounter or go.startCounter != event.startCounter:
            go.doneCounter = event.doneCounter
            go.startCounter = event.startCounter

            if event.action == u'start':
                if go.target:
                    target = self.get_game_state().get_object_by_id(
                        event.targetId)
                    target.materialCount -= 1
                    target_obj = self.get_item_reader().get(target.item)
                    go.materials.append(target_obj.material)
                    if not target.materialCount:
                        logger.info(u'Полностью вырубили %s' % target_obj.name)
                        if hasattr(target_obj, 'box'):
                            box_obj = self.get_item_reader().get(
                                target_obj.box)
                            new_obj = dict2obj({
                                'item': target_obj.box,
                                'type': 'pickup',
                                'id': target.id,
                                'x': target.x,
                                'y': target.y
                            })
                            self.get_game_state().remove_object_by_id(
                                target.id)
                            self.get_game_state().append_object(new_obj)
                            logger.info(u'%s превращён в %s' %
                                        (target_obj.name, box_obj.name))
                        else:
                            self.get_game_state().remove_object_by_id(
                                target.id)

                        go.target = None
                else:
                    # Если это новое дерево, то зомбику нужно поставить что он его рубит,
                    # но эти данные обновятся и так при смене острова
                    go.target = dict2obj({'id': event.targetId})
                    target = self.get_game_state().get_object_by_id(
                        event.targetId)
                    target.gainStarted = True

                # Зомбики продолжают работать
                go.jobStartTime = event.jobStartTime
                go.jobEndTime = event.jobEndTime

            else:
                # Закончили вырубку, освободили мозги и ушли спать
                go.target = None
Example #2
0
    def gain_material_event(self, event):

        go = self.get_game_state().get_object_by_id(event.objId)
        if not go:
            return

        if go.doneCounter != event.doneCounter or go.startCounter != event.startCounter:
            go.doneCounter = event.doneCounter
            go.startCounter = event.startCounter

            if event.action == u'start':
                if go.target:
                    target = self.get_game_state().get_object_by_id(event.targetId)
                    target.materialCount -= 1
                    target_obj = self.get_item_reader().get(target.item)
                    go.materials.append(target_obj.material)
                    if not target.materialCount:
                        logger.info(u'Полностью вырубили %s' % target_obj.name)
                        if hasattr(target_obj, 'box'):
                            box_obj = self.get_item_reader().get(target_obj.box)
                            new_obj = dict2obj({
                                'item': target_obj.box,
                                'type': 'pickup',
                                'id': target.id,
                                'x': target.x,
                                'y': target.y
                            })
                            self.get_game_state().remove_object_by_id(target.id)
                            self.get_game_state().append_object(new_obj)
                            logger.info(u'%s превращён в %s' % (target_obj.name, box_obj.name))
                        else:
                            self.get_game_state().remove_object_by_id(target.id)

                        go.target = None
                else:
                    # Если это новое дерево, то зомбику нужно поставить что он его рубит,
                    # но эти данные обновятся и так при смене острова
                    go.target = dict2obj({'id': event.targetId})
                    target = self.get_game_state().get_object_by_id(event.targetId)
                    target.gainStarted = True

                # Зомбики продолжают работать
                go.jobStartTime = event.jobStartTime
                go.jobEndTime = event.jobEndTime

            else:
                # Закончили вырубку, освободили мозги и ушли спать
                go.target = None
Example #3
0
 def item_event(self, event):
     if event.action == u'sendNewYearGift':
         new_year_object = dict2obj({
             u'treeId': event.objId,
             u'user': event.id
         })
         self.get_game_state().get_state().remoteNewYear.append(
             new_year_object)
Example #4
0
    def perform_action(self):

        if not self.get_params().switch_local_daily_bot:
            return

        players = self.get_game_state().get_players()

        # Ежедневный бонус
        daily_bonus = self.get_game_state().get_state().dailyBonus
        if int(daily_bonus.playFrom) and self.get_timer().has_elapsed(daily_bonus.playFrom, 10):
            daily = DailyBonus()
            self.get_events_sender().send_game_events([daily])

            # Если можно крутнуть ежедневную рулетку,
            # Значит можно уже и дарить ежедневные подарочки
            self.get_game_state().get_state().freeGiftUsers = []

            # Сбрасываем палочки-выручалочки
            self.get_game_state().get_state().magic.used = 0
            self.get_game_state().get_state().magic.expire = unicode(86400000)

        free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
        not_gift_users = [
            x for x in players if x.id not in free_gift_users and x.id not in self.get_params().exclude_low_level
        ]

        if not_gift_users:
            # Подарки нищебродам до 80 уровня
            # Максиммальное время отсутствия, не может быть больше 3 суток
            deadline = 3
            day_timestamp = 1000 * 60 * 60 * 24
            deadline_timestamp = deadline * day_timestamp

            pre_aways = [x for x in not_gift_users if hasattr(x, u"accessDate")]
            lst = [x for x in pre_aways if abs(int(x.accessDate)) < deadline_timestamp and x.level in xrange(40, 81)]

            for user in lst:
                if type(user) == unicode:
                    continue
                for low_level_gift in self.low_level_gifts:
                    if low_level_gift.name in user.liteGameState.wishlist:
                        # Если на складе нет нужного количества для подарка идем к следущему подарку
                        storage_count = self.get_game_state().count_storage(low_level_gift.name)
                        delta = get_item_count(low_level_gift, storage_count)

                        if delta:
                            # Выбрали подарок и дарим его
                            low_level_gift_obj = self.get_item_reader().get(low_level_gift.name)
                            gift_item = SendGiftItem(
                                msg=self.low_level_msg, item=low_level_gift.name, count=delta, user=user.id
                            )
                            send_event = SendGift(gift=gift_item)
                            evts = self.get_events_sender().send_game_events([send_event])
                            evts += self.get_events_sender().send_game_events()

                            # Если успешно прошел подарок идем к следущему соседу по списку
                            filter_evts = [x.type for x in evts]
                            if u"alert" not in filter_evts:
                                friend = self.get_game_state().get_player(user.id)
                                user_name = friend.name if hasattr(friend, "name") else user.id
                                logger.info(
                                    u"Отправляем для %s в подарок % s %i шт"
                                    % (user_name, low_level_gift_obj.name, delta)
                                )

                                if u"storage" in low_level_gift_obj.type:
                                    self.get_game_state().remove_storage(low_level_gift.name, delta)
                            break

            # Бесплатные подарки
            for free_gift in self.free_gifts:
                gift_obj = self.get_item_reader().get(free_gift)

                free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
                lst = [x.id for x in players if free_gift in x.liteGameState.wishlist and x.id not in free_gift_users]

                if lst:
                    logger.info(u"Отправляем бесплатный подарок %s %i игрокам" % (gift_obj.name, len(lst)))
                    freegift_event = SendFreeGifts(msg=self.free_msg, itemId=gift_obj.id, userIds=lst)

                    self.get_events_sender().send_game_events([freegift_event])

                    while lst:
                        lst_item = lst.pop(0)
                        user_obj = dict2obj({"user": lst_item})
                        self.get_game_state().get_state().freeGiftUsers.append(user_obj)

            free_gift = random.choice(self.free_gifts)
            gift_obj = self.get_item_reader().get(free_gift)

            free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
            lst = [x.id for x in players if x.id not in free_gift_users]

            if lst:
                logger.info(u"Отправляем бесплатный подарок %s %i игрокам" % (gift_obj.name, len(lst)))
                freegift_event = SendFreeGifts(msg=self.free_msg, itemId=gift_obj.id, userIds=lst)

                self.get_events_sender().send_game_events([freegift_event])

                while lst:
                    lst_item = lst.pop(0)
                    user_obj = dict2obj({"user": lst_item})
                    self.get_game_state().get_state().freeGiftUsers.append(user_obj)
Example #5
0
    def perform_action(self):

        if not self.get_params().switch_local_trader_bot:
            return

        traders = self.get_game_state().get_objects_by_types([u'traderGrave'])

        for trader in traders:
            trader_obj = self.get_item_reader().get(trader.item)
            if not trader.started:
                start_evt = StartWorker(objId=trader.id)
                evts = self.get_events_sender().send_game_events([start_evt])

                # Если от сервера пришло сообщение о том что нет мозгов,
                # то обрабатываем его сразу чтобы знать кто не будет работать
                no_brains = False
                for evt in evts:
                    if evt.type == u'alert':
                        if evt.msg == u'SERVER_NO_BRAINS':
                            no_brains = True
                if not no_brains:
                    logger.info(u'Отправляем работать %s %i' %
                                (trader_obj.name, trader.id))
                    trader.started = True

            # Если не меняется сейчас
            if not trader.countExchange:

                if not trader.countCompleted and self.get_params(
                ).mega_exchanges:
                    mega = self.get_params().mega_exchanges.pop(0)
                    exchange_evt = TradeExchange(objId=trader.id,
                                                 user=None,
                                                 give=mega.get('give'),
                                                 want=mega.get('want'))
                    self.get_events_sender().send_game_events([exchange_evt])
                    logger.info(u'Установили мега-обмен в %s %i' %
                                (trader_obj.name, trader.id))

                old_trader_give = []
                old_trader_want = []

                # Если уже обменяли
                if trader.countCompleted:
                    give_str, want_str = u'', u''
                    old_trader_give = obj2dict(trader.give)
                    for give in trader.give:
                        give_item_obj = self.get_item_reader().get(give.item)
                        give_str = u', %s %i шт' if give_str else u'%s %i шт'
                        give_str = give_str % (give_item_obj.name, give.count)
                        if u'collectionItem' == give_item_obj.type:
                            self.get_game_state().remove_collection_item(
                                give.item, give.count)
                        elif u'collection' == give_item_obj.type:
                            self.get_game_state().remove_collection(
                                give_item_obj.items, give.count)
                        elif u'storage' in give_item_obj.type:
                            self.get_game_state().remove_storage(
                                give.item, give.count)
                    old_trader_want = obj2dict(trader.want)
                    for want in trader.want:
                        want_item_obj = self.get_item_reader().get(want.item)
                        want_str = u', %s %i шт' if want_str else u'%s %i шт'
                        want_str = want_str % (want_item_obj.name, want.count)
                        if u'collectionItem' == want_item_obj.type:
                            self.get_game_state().add_collection_item(
                                want.item, want.count)
                        elif u'collection' == want_item_obj.type:
                            self.get_game_state().add_collection(
                                want_item_obj.items, want.count)
                        elif u'storage' in want_item_obj.type:
                            self.get_game_state().add_storage(
                                want.item, want.count)
                    pick_evt = GameRemotePickItem(trader.id)
                    self.get_events_sender().send_game_events([pick_evt])
                    logger.info(u'%s  %i совершил обмен' %
                                (trader_obj.name, trader.id))
                    logger.info(u'     Отдали %s' % give_str)
                    logger.info(u'     Приняли %s' % want_str)
                    trader.countCompleted = 0

                old_exchange = {
                    'gives': old_trader_give,
                    'wants': old_trader_want
                }

                # Кидаем новый обмен
                exchange = self.select_exchange(old_exchange)
                if not exchange:
                    continue

                trader.__setattr__(u'give', [])
                for my_give in exchange.get(u'gives', []):
                    trader.give.append(dict2obj(my_give))

                trader.__setattr__(u'want', [])
                for my_want in exchange.get(u'wants', []):
                    trader.want.append(dict2obj(my_want))

                exchange_evt = TradeExchange(objId=trader.id,
                                             user=None,
                                             give=exchange.get(u'gives', []),
                                             want=exchange.get(u'wants', []))
                self.get_events_sender().send_game_events([exchange_evt])

                logger.info(u'%s %i обновлен' % (trader_obj.name, trader.id))
                trader.countExchange = 1
Example #6
0
    def perform_action(self):

        if not self.get_params().switch_local_buff_bot:
            return

        # проходим по ним
        for signal_name in self.buff_dict:
            # если мы должны его активировать при необходимости
            if getattr(self.get_params(), signal_name):

                # считаем что бонус нужно активировать
                need_buff = True
                # получаем список возможных бонусов по данному типу
                buffs = self.buff_dict.get(signal_name)

                # ищем, есть ли у нас активированный бонус
                for l in self.get_game_state().get_state().buffs.list:
                    # если он еще активен, то помечаем что данный бонус пока не нужно активировать
                    for buff in buffs:
                        buff_obj = self.get_item_reader().get(buff)

                        if hasattr(buff_obj, 'items'):
                            if buff_obj.items[0].item == l.item:
                                need_buff = self.get_timer().has_elapsed(l.expire.endDate, -10)
                        else:
                            l_obj = self.get_item_reader().get(l.item)
                            if buff_obj.id == l_obj.id:
                                need_buff = self.get_timer().has_elapsed(l.expire.endDate, -10)

                # если все-таки нужно активировать
                if need_buff:
                    # если это проездной то ставим сигнал для крафтинга
                    if signal_name == u'travel_buff':
                        self.get_game_state().set_signal(u'travel_buff', True)
                        return

                    # для всех остальных активируем со склада
                    for buff in buffs:
                        # смотрим сколько у нас на складе есть
                        buff_count = self.get_game_state().count_storage(buff)

                        # если есть то активируем
                        if buff_count:
                            buff_obj = self.get_item_reader().get(buff)
                            buff_duration = self.get_item_reader().get(buff_obj.items[0].item).expire.duration
                            buff_type = self.get_item_reader().get(buff_obj.items[0].item).expire.type

                            buff_event = GameUseStorageItem(itemId=buff_obj.id)
                            self.get_events_sender().send_game_events([buff_event])

                            logger.info(u'Активируем %s' % buff_obj.name)

                            # создаем новый объект-бонус для записи в гейм-стейт
                            expire = dict2obj({
                                u'endDate': unicode(buff_duration * 1000),
                                u'type': buff_type
                            })

                            new_buff = dict2obj({
                                u'item': buff_obj.items[0].item,
                                u'expire': expire
                            })

                            # записываем в геймстейт новый бонус
                            self.get_game_state().get_state().buffs.list.append(new_buff)
                            break
Example #7
0
    def perform_action(self):

        if not self.get_params().switch_local_craft_bot:
            return

        # Если нужно крафтить изумрудку
        if self.get_params().allow_craft_emerald_collection:
            # Если нашли обсерваторию на острове
            buildings = self.get_game_state().get_objects_by_items(
                [u'@B_OBSERVATORY'])

            if buildings:
                # Искомая постройка
                building = buildings[0]
                building_obj = self.get_item_reader().get(building.item)

                # Если постройка достроена то идем дальше
                if hasattr(building_obj,
                           u'upgrades') and building.level == len(
                               building_obj.upgrades):

                    # Проверяем количество бозонов и японки
                    bozon_count = self.get_game_state().count_storage(
                        u'@CR_666')
                    japan_coll_obj = self.get_item_reader().get(u'C_36')
                    japan_count = self.get_game_state().count_collection(
                        japan_coll_obj.items)

                    # Проверяем по таймерам возможность создавать всю коллекцию целиком
                    may_crafted_full_collection = True
                    next_play_times = building.nextPlayTimes.__dict__
                    for emerald, craft_obj in self.emerald_crafts.items():
                        craft = building_obj.crafts[craft_obj.get(u'craft_id')]
                        if not self.get_timer().has_elapsed(
                                next_play_times[craft.craftId], 1):
                            may_crafted_full_collection = False

                    # ставим сигнал на крафтинг изумрудки, если есть что создать, и позволяет таймер
                    if min([bozon_count / 5, japan_count / 10
                            ]) and may_crafted_full_collection:

                        for emerald, craft_obj in self.emerald_crafts.items():
                            found = False

                            # проходим по этому списку
                            for will_craft in self.get_params().crafts:
                                # если в списке есть эта постройка
                                if will_craft.building == craft_obj.get(
                                        u'building'):
                                    # и в ней уже задан нужный craft_id или же он пуст, т.е. создается всё возможное
                                    if will_craft.craft_id is None or \
                                       will_craft.craft_id == craft_obj.get(u'craft_id'):
                                        # отмечаем что нашли такую позицию
                                        found = True

                                        # смотрим был ли там установлен сигнал для крафтинга.
                                        # Если да, то активируем его, если нет то считаем что он и так будет создаваться
                                        if will_craft.signal:
                                            self.get_game_state().set_signal(
                                                will_craft.signal, True)

                                        # смотрим был ли там установлен количество крафтинга.
                                        # Если да, то ставим нужное количество,
                                        # если нет то считаем что создасться максимум
                                        will_craft.count = bozon_count / 5
                                        break

                            # если не нашли такой постройки
                            if not found:
                                # создаем сигнал для активации
                                self.get_game_state().set_signal(emerald, True)

                                # создаем новый параметр для крафтинга с нужным нам значением
                                self.get_params().crafts.append(
                                    CraftItem(
                                        building=craft_obj.get(u'building'),
                                        craft_id=craft_obj.get(u'craft_id'),
                                        count=1,
                                        signal=emerald))

        # Список для крафтинга всего остального
        crafts = self.get_params().crafts
        for craft_obj in crafts:

            # Если нет сигнала о том, что нужно создавать
            if craft_obj.signal is not None and \
                    not self.get_game_state().get_signal(craft_obj.signal):
                continue

            buildings = self.get_game_state().get_objects_by_items(
                [craft_obj.building])
            # Если нет постройки для создания то ищем дальше
            if not buildings:
                continue

            # Искомая постройка
            building = buildings[0]
            building_obj = self.get_item_reader().get(building.item)

            # Если постройка не достроена то идем дальше
            if hasattr(building_obj, u'upgrades') and building.level < len(
                    building_obj.upgrades):
                continue

            # Если не указан craft_id значит создаем все что возможно в постройке
            if craft_obj.craft_id is not None:
                crafts_list = [building_obj.crafts[craft_obj.craft_id]]
            else:
                crafts_list = building_obj.crafts

            for craft in crafts_list:
                craft_events, res = [], []
                # Ищем количество которое возможно создать
                for material in craft.materials:
                    material_obj = self.get_item_reader().get(material.item)
                    if u'collection' in material_obj.type:
                        balance = 0 if craft_obj.count else 300
                        coll_item_count = \
                            (self.get_game_state().count_collection_item(material.item) - balance) / material.count
                        coll_item_count = coll_item_count if coll_item_count >= 0 else 0
                        res.append(coll_item_count)
                    elif u'storage' in material_obj.type:
                        if material_obj.id == u'COINS':
                            coins_item_count = self.get_game_state().get_state(
                            ).gameMoney / material.count
                            res.append(coins_item_count)
                        else:
                            storage_item_count = self.get_game_state(
                            ).count_storage(material.item) / material.count
                            res.append(storage_item_count)

                # Если мы указали количество создаваемых элементов, то смотрим
                # можем ли мы создать такое количество
                # В другом случае создаем максимально возможное значение
                if craft_obj.count:
                    craft_count = craft_obj.count if min(
                        res) / craft_obj.count else 0
                else:
                    craft_count = min(res)

                # Создаем требуемое количество элементов
                if craft_count:
                    for i in xrange(craft_count):
                        craft_event = Craft(itemId=craft.id, objId=building.id)
                        craft_events.append(craft_event)

                    self.get_events_sender().send_game_pack_events(
                        craft_events)

                    # Снимаем сигнал к созданию элементов
                    if craft_obj.signal is not None:
                        self.get_game_state().set_signal(
                            craft_obj.signal, False)

                    # Смотрим на результат создания
                    total = craft.resultCount * craft_count
                    craft_result_obj = self.get_item_reader().get(craft.result)

                    logger.info(
                        u'Создали в %s %s %i шт' %
                        (building_obj.name, craft_result_obj.name, total))

                    # Списываем материал или коллекции
                    for material in craft.materials:
                        material_obj = self.get_item_reader().get(
                            material.item)
                        if u'collection' in material_obj.type:
                            self.get_game_state().remove_collection_item(
                                material.item, material.count * craft_count)

                        elif u'storage' in material_obj.type:
                            if material_obj.id == u'COINS':
                                self.get_game_state().get_state(
                                ).gameMoney -= material.count * craft_count
                            else:
                                self.get_game_state().remove_storage(
                                    material.item,
                                    material.count * craft_count)

                    # Добавляем результат в коллекции
                    if u'collection' in craft_result_obj.type:
                        self.get_game_state().add_collection_item(
                            craft_result_obj.id, total)

                    # Добавляем результат на склад
                    if u'storage' in craft_result_obj.type:
                        if craft_result_obj.id == u'COINS':
                            self.get_game_state().get_state(
                            ).gameMoney += total
                        else:
                            self.get_game_state().add_storage(
                                craft.result, total)

                    # Добавляем результат в буфф если это проездной
                    if u'travelTicketBuff' in craft_result_obj.type:
                        buff_duration = self.get_item_reader().get(
                            craft_result_obj.id).expire.duration
                        buff_type = self.get_item_reader().get(
                            craft_result_obj.id).expire.type

                        expire = dict2obj({
                            u'endDate':
                            unicode(buff_duration * 1000),
                            u'type':
                            buff_type
                        })
                        new_buff = dict2obj({
                            u'item': '@%s' % craft_result_obj.id,
                            u'expire': expire
                        })

                        self.get_game_state().get_state().buffs.list.append(
                            new_buff)
Example #8
0
    def perform_action(self):

        if not self.get_params().switch_local_trader_bot:
            return

        traders = self.get_game_state().get_objects_by_types([u'traderGrave'])

        for trader in traders:
            trader_obj = self.get_item_reader().get(trader.item)
            if not trader.started:
                start_evt = StartWorker(objId=trader.id)
                evts = self.get_events_sender().send_game_events([start_evt])

                # Если от сервера пришло сообщение о том что нет мозгов,
                # то обрабатываем его сразу чтобы знать кто не будет работать
                no_brains = False
                for evt in evts:
                    if evt.type == u'alert':
                        if evt.msg == u'SERVER_NO_BRAINS':
                            no_brains = True
                if not no_brains:
                    logger.info(u'Отправляем работать %s %i' % (trader_obj.name, trader.id))
                    trader.started = True

            # Если не меняется сейчас
            if not trader.countExchange:

                if not trader.countCompleted and self.get_params().mega_exchanges:
                    mega = self.get_params().mega_exchanges.pop(0)
                    exchange_evt = TradeExchange(objId=trader.id, user=None, give=mega.get('give'),
                                                 want=mega.get('want'))
                    self.get_events_sender().send_game_events([exchange_evt])
                    logger.info(u'Установили мега-обмен в %s %i' % (trader_obj.name, trader.id))

                old_trader_give = []
                old_trader_want = []

                # Если уже обменяли
                if trader.countCompleted:
                    give_str, want_str = u'', u''
                    old_trader_give = obj2dict(trader.give)
                    for give in trader.give:
                        give_item_obj = self.get_item_reader().get(give.item)
                        give_str = u', %s %i шт' if give_str else u'%s %i шт'
                        give_str = give_str % (give_item_obj.name, give.count)
                        if u'collectionItem' == give_item_obj.type:
                            self.get_game_state().remove_collection_item(give.item, give.count)
                        elif u'collection' == give_item_obj.type:
                            self.get_game_state().remove_collection(give_item_obj.items, give.count)
                        elif u'storage' in give_item_obj.type:
                            self.get_game_state().remove_storage(give.item, give.count)
                    old_trader_want = obj2dict(trader.want)
                    for want in trader.want:
                        want_item_obj = self.get_item_reader().get(want.item)
                        want_str = u', %s %i шт' if want_str else u'%s %i шт'
                        want_str = want_str % (want_item_obj.name, want.count)
                        if u'collectionItem' == want_item_obj.type:
                            self.get_game_state().add_collection_item(want.item, want.count)
                        elif u'collection' == want_item_obj.type:
                            self.get_game_state().add_collection(want_item_obj.items, want.count)
                        elif u'storage' in want_item_obj.type:
                            self.get_game_state().add_storage(want.item, want.count)
                    pick_evt = GameRemotePickItem(trader.id)
                    self.get_events_sender().send_game_events([pick_evt])
                    logger.info(u'%s  %i совершил обмен' % (trader_obj.name, trader.id))
                    logger.info(u'     Отдали %s' % give_str)
                    logger.info(u'     Приняли %s' % want_str)
                    trader.countCompleted = 0

                old_exchange = {
                    'gives': old_trader_give,
                    'wants': old_trader_want
                }

                # Кидаем новый обмен
                exchange = self.select_exchange(old_exchange)
                if not exchange:
                    continue

                trader.__setattr__(u'give', [])
                for my_give in exchange.get(u'gives', []):
                    trader.give.append(dict2obj(my_give))

                trader.__setattr__(u'want', [])
                for my_want in exchange.get(u'wants', []):
                    trader.want.append(dict2obj(my_want))

                exchange_evt = TradeExchange(objId=trader.id, user=None, give=exchange.get(u'gives', []),
                                             want=exchange.get(u'wants', []))
                self.get_events_sender().send_game_events([exchange_evt])

                logger.info(u'%s %i обновлен' % (trader_obj.name, trader.id))
                trader.countExchange = 1
Example #9
0
    def perform_action(self):

        if not self.get_params().switch_local_magic_bot:
            return

        current_loc_id = self.get_game_state().get_game_loc().id
        if current_loc_id not in self.get_params().allow_magic_locations:
            return

        # Если уже использовали 500 палочек
        if self.get_game_state().get_state().magic.used == self.magic_limit:
            return

        # Если нет палочек в наличии
        if not self.get_game_state().count_storage(u'@MAGIC_WAND'):
            self.get_game_state().set_signal(u'hell_coll', True)
            return

        events = []
        gain_list = self.get_game_state().get_objects_by_types(['woodTree', 'stone'])

        for gain_item in gain_list:
            if not gain_item.gainStarted:
                magic_obj = self.get_item_reader().get(gain_item.item)
                logger.info(u'Вырубаем палочками %s(%i) %i (%i, %i)' %
                            (magic_obj.name, gain_item.materialCount, gain_item.id, gain_item.x, gain_item.y))

                while gain_item.materialCount:
                    magic_event = Magic(objId=gain_item.id)
                    events.append(magic_event)
                    gain_item.materialCount -= 1
                    self.get_game_state().get_state().magic.used += 1
                    self.get_game_state().add_storage(magic_obj.material, 1)
                    self.get_game_state().remove_storage(u'@MAGIC_WAND', 1)

                    # Если уже использовали 500 палочек, то прекращаем вырубку ресурса
                    if self.get_game_state().get_state().magic.used == self.magic_limit:
                        break

                    # Если нет палочек в наличии, то прекращаем вырубку ресурса
                    if not self.get_game_state().count_storage(u'@MAGIC_WAND'):
                        self.get_game_state().set_signal(u'hell_coll', True)
                        break

                # Если вырубили до конца, то ставим ящик вместо дерева
                if not gain_item.materialCount:
                    if hasattr(magic_obj, 'box'):
                        box_item = self.get_item_reader().get(magic_obj.box)
                        new_obj = dict2obj({
                            'item': magic_obj.box,
                            'type': 'pickup',
                            'id': gain_item.id,
                            'x': gain_item.x,
                            'y': gain_item.y
                        })
                        self.get_game_state().remove_object_by_id(gain_item.id)
                        self.get_game_state().append_object(new_obj)
                        logger.info(u'%s превращён в %s' % (magic_obj.name, box_item.name))
                    else:
                        self.get_game_state().remove_object_by_id(gain_item.id)

            # Если уже использовали 500 палочек, то прекращаем поиск ресурсов
            if self.get_game_state().get_state().magic.used == self.magic_limit:
                break

            # Если нет палочек в наличии, то прекращаем вырубку ресурса
            if not self.get_game_state().count_storage(u'@MAGIC_WAND'):
                self.get_game_state().set_signal(u'hell_coll', True)
                break

        self.get_events_sender().send_game_pack_events(events)

        # Если получен сигнал, что нужны палочки для вырубки, значит обмениваем ад, чтобы на складе
        if self.get_game_state().get_signal(u'hell_coll'):
            # Адская коллекция
            hell_coll = u'C_34'

            coll_obj = self.get_item_reader().get(hell_coll)
            # Количество коллекций на складе
            hell_count = self.get_game_state().count_collection(coll_obj.items)
            # Необходимое количество коллекций, чтобы добить палочками лимит на сутки
            hell_need = (self.magic_limit - self.get_game_state().get_state().magic.used -
                         self.get_game_state().count_storage(u'@MAGIC_WAND')) / 15 + 1

            # Берем минимум сколько можем обменять: либо сколько надо, либо сколько есть
            delta = long(min([hell_count, hell_need]))

            changed_colls = self.get_params().changed_colls
            # Если у нас задан минимум для это коллекции, то берем с учетом минимума
            for changed_coll in changed_colls:
                if changed_coll.name == hell_coll and changed_coll.min < hell_count:
                    delta = long(min([hell_count - changed_coll.min, hell_need]))

            # Если есть, что менять
            if delta:
                logger.info(u'Обменяли %s %i шт' % (coll_obj.name, delta))
                exchange_coll_event = GameExchangeCollection(itemId=hell_coll, count=delta)
                self.get_events_sender().send_game_events([exchange_coll_event])

                # Списываем коллекции
                self.get_game_state().remove_collection(coll_obj.items, delta)

                # Добавляем палочки на склад
                for prize in coll_obj.prizes:
                    self.get_game_state().add_storage(prize.item, prize.count * delta)

                # Снимаем сигнал на создание палочек
                self.get_game_state().set_signal(u'hell_coll', False)
Example #10
0
    def perform_action(self):

        if not self.get_params().switch_local_craft_bot:
            return

        # Если нужно крафтить изумрудку
        if self.get_params().allow_craft_emerald_collection:
            # Если нашли обсерваторию на острове
            buildings = self.get_game_state().get_objects_by_items([u'@B_OBSERVATORY'])

            if buildings:
                # Искомая постройка
                building = buildings[0]
                building_obj = self.get_item_reader().get(building.item)

                # Если постройка достроена то идем дальше
                if hasattr(building_obj, u'upgrades') and building.level == len(building_obj.upgrades):

                    # Проверяем количество бозонов и японки
                    bozon_count = self.get_game_state().count_storage(u'@CR_666')
                    japan_coll_obj = self.get_item_reader().get(u'C_36')
                    japan_count = self.get_game_state().count_collection(japan_coll_obj.items)

                    # Проверяем по таймерам возможность создавать всю коллекцию целиком
                    may_crafted_full_collection = True
                    next_play_times = building.nextPlayTimes.__dict__
                    for emerald, craft_obj in self.emerald_crafts.items():
                        craft = building_obj.crafts[craft_obj.get(u'craft_id')]
                        if not self.get_timer().has_elapsed(next_play_times[craft.craftId], 1):
                            may_crafted_full_collection = False

                    # ставим сигнал на крафтинг изумрудки, если есть что создать, и позволяет таймер
                    if min([bozon_count / 5, japan_count / 10]) and may_crafted_full_collection:

                        for emerald, craft_obj in self.emerald_crafts.items():
                            found = False

                            # проходим по этому списку
                            for will_craft in self.get_params().crafts:
                                # если в списке есть эта постройка
                                if will_craft.building == craft_obj.get(u'building'):
                                    # и в ней уже задан нужный craft_id или же он пуст, т.е. создается всё возможное
                                    if will_craft.craft_id is None or \
                                       will_craft.craft_id == craft_obj.get(u'craft_id'):
                                        # отмечаем что нашли такую позицию
                                        found = True

                                        # смотрим был ли там установлен сигнал для крафтинга.
                                        # Если да, то активируем его, если нет то считаем что он и так будет создаваться
                                        if will_craft.signal:
                                            self.get_game_state().set_signal(will_craft.signal, True)

                                        # смотрим был ли там установлен количество крафтинга.
                                        # Если да, то ставим нужное количество,
                                        # если нет то считаем что создасться максимум
                                        will_craft.count = bozon_count / 5
                                        break

                            # если не нашли такой постройки
                            if not found:
                                # создаем сигнал для активации
                                self.get_game_state().set_signal(emerald, True)

                                # создаем новый параметр для крафтинга с нужным нам значением
                                self.get_params().crafts.append(CraftItem(
                                    building=craft_obj.get(u'building'),
                                    craft_id=craft_obj.get(u'craft_id'),
                                    count=1,
                                    signal=emerald
                                ))

        # Список для крафтинга всего остального
        crafts = self.get_params().crafts
        for craft_obj in crafts:

            # Если нет сигнала о том, что нужно создавать
            if craft_obj.signal is not None and \
                    not self.get_game_state().get_signal(craft_obj.signal):
                continue

            buildings = self.get_game_state().get_objects_by_items([craft_obj.building])
            # Если нет постройки для создания то ищем дальше
            if not buildings:
                continue

            # Искомая постройка
            building = buildings[0]
            building_obj = self.get_item_reader().get(building.item)

            # Если постройка не достроена то идем дальше
            if hasattr(building_obj, u'upgrades') and building.level < len(building_obj.upgrades):
                continue

            # Если не указан craft_id значит создаем все что возможно в постройке
            if craft_obj.craft_id is not None:
                crafts_list = [building_obj.crafts[craft_obj.craft_id]]
            else:
                crafts_list = building_obj.crafts

            for craft in crafts_list:
                craft_events, res = [], []
                # Ищем количество которое возможно создать
                for material in craft.materials:
                    material_obj = self.get_item_reader().get(material.item)
                    if u'collection' in material_obj.type:
                        balance = 0 if craft_obj.count else 300
                        coll_item_count = \
                            (self.get_game_state().count_collection_item(material.item) - balance) / material.count
                        coll_item_count = coll_item_count if coll_item_count >= 0 else 0
                        res.append(coll_item_count)
                    elif u'storage' in material_obj.type:
                        if material_obj.id == u'COINS':
                            coins_item_count = self.get_game_state().get_state().gameMoney / material.count
                            res.append(coins_item_count)
                        else:
                            storage_item_count = self.get_game_state().count_storage(material.item) / material.count
                            res.append(storage_item_count)

                # Если мы указали количество создаваемых элементов, то смотрим
                # можем ли мы создать такое количество
                # В другом случае создаем максимально возможное значение
                if craft_obj.count:
                    craft_count = craft_obj.count if min(res) / craft_obj.count else 0
                else:
                    craft_count = min(res)

                # Создаем требуемое количество элементов
                if craft_count:
                    for i in xrange(craft_count):
                        craft_event = Craft(itemId=craft.id, objId=building.id)
                        craft_events.append(craft_event)

                    self.get_events_sender().send_game_pack_events(craft_events)

                    # Снимаем сигнал к созданию элементов
                    if craft_obj.signal is not None:
                        self.get_game_state().set_signal(craft_obj.signal, False)

                    # Смотрим на результат создания
                    total = craft.resultCount * craft_count
                    craft_result_obj = self.get_item_reader().get(craft.result)

                    logger.info(u'Создали в %s %s %i шт' % (building_obj.name, craft_result_obj.name, total))

                    # Списываем материал или коллекции
                    for material in craft.materials:
                        material_obj = self.get_item_reader().get(material.item)
                        if u'collection' in material_obj.type:
                            self.get_game_state().remove_collection_item(
                                material.item, material.count * craft_count)

                        elif u'storage' in material_obj.type:
                            if material_obj.id == u'COINS':
                                self.get_game_state().get_state().gameMoney -= material.count * craft_count
                            else:
                                self.get_game_state().remove_storage(material.item, material.count * craft_count)

                    # Добавляем результат в коллекции
                    if u'collection' in craft_result_obj.type:
                        self.get_game_state().add_collection_item(craft_result_obj.id, total)

                    # Добавляем результат на склад
                    if u'storage' in craft_result_obj.type:
                        if craft_result_obj.id == u'COINS':
                            self.get_game_state().get_state().gameMoney += total
                        else:
                            self.get_game_state().add_storage(craft.result, total)

                    # Добавляем результат в буфф если это проездной
                    if u'travelTicketBuff' in craft_result_obj.type:
                        buff_duration = self.get_item_reader().get(craft_result_obj.id).expire.duration
                        buff_type = self.get_item_reader().get(craft_result_obj.id).expire.type

                        expire = dict2obj({
                            u'endDate': unicode(buff_duration * 1000),
                            u'type': buff_type
                        })
                        new_buff = dict2obj({
                            u'item': '@%s' % craft_result_obj.id,
                            u'expire': expire
                        })

                        self.get_game_state().get_state().buffs.list.append(new_buff)
Example #11
0
    def perform_action(self):

        if not self.get_params().switch_local_buff_bot:
            return

        # проходим по ним
        for signal_name in self.buff_dict:
            # если мы должны его активировать при необходимости
            if getattr(self.get_params(), signal_name):

                # считаем что бонус нужно активировать
                need_buff = True
                # получаем список возможных бонусов по данному типу
                buffs = self.buff_dict.get(signal_name)

                # ищем, есть ли у нас активированный бонус
                for l in self.get_game_state().get_state().buffs.list:
                    # если он еще активен, то помечаем что данный бонус пока не нужно активировать
                    for buff in buffs:
                        buff_obj = self.get_item_reader().get(buff)

                        if hasattr(buff_obj, 'items'):
                            if buff_obj.items[0].item == l.item:
                                need_buff = self.get_timer().has_elapsed(
                                    l.expire.endDate, -10)
                        else:
                            l_obj = self.get_item_reader().get(l.item)
                            if buff_obj.id == l_obj.id:
                                need_buff = self.get_timer().has_elapsed(
                                    l.expire.endDate, -10)

                # если все-таки нужно активировать
                if need_buff:
                    # если это проездной то ставим сигнал для крафтинга
                    if signal_name == u'travel_buff':
                        self.get_game_state().set_signal(u'travel_buff', True)
                        return

                    # для всех остальных активируем со склада
                    for buff in buffs:
                        # смотрим сколько у нас на складе есть
                        buff_count = self.get_game_state().count_storage(buff)

                        # если есть то активируем
                        if buff_count:
                            buff_obj = self.get_item_reader().get(buff)
                            buff_duration = self.get_item_reader().get(
                                buff_obj.items[0].item).expire.duration
                            buff_type = self.get_item_reader().get(
                                buff_obj.items[0].item).expire.type

                            buff_event = GameUseStorageItem(itemId=buff_obj.id)
                            self.get_events_sender().send_game_events(
                                [buff_event])

                            logger.info(u'Активируем %s' % buff_obj.name)

                            # создаем новый объект-бонус для записи в гейм-стейт
                            expire = dict2obj({
                                u'endDate':
                                unicode(buff_duration * 1000),
                                u'type':
                                buff_type
                            })

                            new_buff = dict2obj({
                                u'item': buff_obj.items[0].item,
                                u'expire': expire
                            })

                            # записываем в геймстейт новый бонус
                            self.get_game_state().get_state(
                            ).buffs.list.append(new_buff)
                            break
Example #12
0
    def perform_action(self):

        if not self.get_params().switch_local_daily_bot:
            return

        players = self.get_game_state().get_players()

        # Ежедневный бонус
        daily_bonus = self.get_game_state().get_state().dailyBonus
        if int(daily_bonus.playFrom) and self.get_timer().has_elapsed(daily_bonus.playFrom, 10):
            daily = DailyBonus()
            self.get_events_sender().send_game_events([daily])

            # Если можно крутнуть ежедневную рулетку,
            # Значит можно уже и дарить ежедневные подарочки
            self.get_game_state().get_state().freeGiftUsers = []

            # Сбрасываем палочки-выручалочки
            self.get_game_state().get_state().magic.used = 0
            self.get_game_state().get_state().magic.expire = unicode(86400000)

        free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
        not_gift_users = [x for x in players
                          if x.id not in free_gift_users and x.id not in self.get_params().exclude_low_level]

        if not_gift_users:
            # Подарки нищебродам до 80 уровня
            # Максиммальное время отсутствия, не может быть больше 3 суток
            deadline = 3
            day_timestamp = 1000 * 60 * 60 * 24
            deadline_timestamp = deadline * day_timestamp

            pre_aways = [x for x in not_gift_users if hasattr(x, u'accessDate')]
            lst = [x for x in pre_aways if abs(int(x.accessDate)) < deadline_timestamp and x.level in xrange(40, 81)]

            for user in lst:
                if type(user) == unicode:
                    continue
                for low_level_gift in self.low_level_gifts:
                    if low_level_gift.name in user.liteGameState.wishlist:
                        # Если на складе нет нужного количества для подарка идем к следущему подарку
                        storage_count = self.get_game_state().count_storage(low_level_gift.name)
                        delta = get_item_count(low_level_gift, storage_count)

                        if delta:
                            # Выбрали подарок и дарим его
                            low_level_gift_obj = self.get_item_reader().get(low_level_gift.name)
                            gift_item = SendGiftItem(msg=self.low_level_msg, item=low_level_gift.name,
                                                     count=delta, user=user.id)
                            send_event = SendGift(gift=gift_item)
                            evts = self.get_events_sender().send_game_events([send_event])
                            evts += self.get_events_sender().send_game_events()

                            # Если успешно прошел подарок идем к следущему соседу по списку
                            filter_evts = [x.type for x in evts]
                            if u'alert' not in filter_evts:
                                friend = self.get_game_state().get_player(user.id)
                                user_name = friend.name if hasattr(friend, 'name') else user.id
                                logger.info(u'Отправляем для %s в подарок % s %i шт' %
                                            (user_name, low_level_gift_obj.name, delta))

                                if u'storage' in low_level_gift_obj.type:
                                    self.get_game_state().remove_storage(low_level_gift.name, delta)
                            break

            # Бесплатные подарки
            for free_gift in self.free_gifts:
                gift_obj = self.get_item_reader().get(free_gift)

                free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
                lst = [x.id for x in players if free_gift in x.liteGameState.wishlist and x.id not in free_gift_users]

                if lst:
                    logger.info(u'Отправляем бесплатный подарок %s %i игрокам' % (gift_obj.name, len(lst)))
                    freegift_event = SendFreeGifts(msg=self.free_msg, itemId=gift_obj.id, userIds=lst)

                    self.get_events_sender().send_game_events([freegift_event])

                    while lst:
                        lst_item = lst.pop(0)
                        user_obj = dict2obj({'user': lst_item})
                        self.get_game_state().get_state().freeGiftUsers.append(user_obj)

            free_gift = random.choice(self.free_gifts)
            gift_obj = self.get_item_reader().get(free_gift)

            free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
            lst = [x.id for x in players if x.id not in free_gift_users]

            if lst:
                logger.info(u'Отправляем бесплатный подарок %s %i игрокам' % (gift_obj.name, len(lst)))
                freegift_event = SendFreeGifts(msg=self.free_msg, itemId=gift_obj.id, userIds=lst)

                self.get_events_sender().send_game_events([freegift_event])

                while lst:
                    lst_item = lst.pop(0)
                    user_obj = dict2obj({'user': lst_item})
                    self.get_game_state().get_state().freeGiftUsers.append(user_obj)
Example #13
0
 def buyed_brains_event(self, event):
     buyed_brain = dict2obj({
         'count': event.brains.count,
         'endTime': event.brains.endTime
     })
     self.get_game_state().get_state().buyedBrains.append(buyed_brain)
Example #14
0
    def perform_action(self):

        if not self.get_params().switch_local_place_bot:
            return

        current_loc = self.get_game_state().get_game_loc().id

        if self.get_params().place_items_dict.get(current_loc):
            place = self.get_params().place_items_dict.get(current_loc)
        else:
            place = self.get_params().place_items_dict.get(u'other')

        if not place:
            return

        if self.get_params().allow_clear_location:
            decor_evts = []
            decorations = []
            for decor_item in self.get_params().allow_clear_location:
                decorations += self.get_game_state().get_objects_by_items([decor_item])

            for decoration in decorations:
                evt = GameSellGameObject(objId=decoration.id)
                decor_evts.append(evt)
                self.get_game_state().remove_object_by_id(decoration.id)

            if decor_evts:
                logger.info(u'Очищаем заданные объекты')
                self.get_events_sender().send_game_pack_events(decor_evts)

        place_obj = self.get_item_reader().get(place)

        # Получаем координаты углов карты и заранее места где нельзя ставить
        crd_top, bad_crd = self.get_coords(current_loc)
        if not crd_top and not bad_crd:
            return

        # вычисляем координаты которые уже заняты
        self.parse_bad_coords(bad_crd)

        evts = []
        crd_list = 1
        while crd_list:
            crd_list = self.get_space(place_obj, bad_crd, crd_top)
            if not crd_list:
                break

            next_id = max(
                [_i.maxGameObjectId for _i in self.get_game_state().get_state().locationInfos] +
                [_m.id for _m in self.get_game_state().get_state().gameObjects]) + 1

            for crd in crd_list:
                if self.get_game_state().get_state().gameMoney > 1000000:
                    buy_event = GameBuyItem(itemId=place_obj.id, objId=long(next_id), x=long(crd[0]), y=long(crd[1]))
                    evts.append(buy_event)

                    self.get_game_state().get_state().gameMoney -= place_obj.buyCoins
                    self.get_game_state().get_state().gameObjects.append(dict2obj({
                        u'item': place,
                        u'y': crd[1],
                        u'x': crd[0],
                        u'type': place_obj.type,
                        u'id': next_id
                    }))
                    next_id += 1

        if evts:
            logger.info(u'Ставим %s %i шт' % (place_obj.name, len(evts)))
            self.get_events_sender().send_game_pack_events(evts)
Example #15
0
 def buyed_brains_event(self, event):
     buyed_brain = dict2obj({'count': event.brains.count, 'endTime': event.brains.endTime})
     self.get_game_state().get_state().buyedBrains.append(buyed_brain)
Example #16
0
    def perform_action(self):

        if not self.get_params().switch_local_magic_bot:
            return

        current_loc_id = self.get_game_state().get_game_loc().id
        if current_loc_id not in self.get_params().allow_magic_locations:
            return

        # Если уже использовали 500 палочек
        if self.get_game_state().get_state().magic.used == self.magic_limit:
            return

        # Если нет палочек в наличии
        if not self.get_game_state().count_storage(u'@MAGIC_WAND'):
            self.get_game_state().set_signal(u'hell_coll', True)
            return

        events = []
        gain_list = self.get_game_state().get_objects_by_types(
            ['woodTree', 'stone'])

        for gain_item in gain_list:
            if not gain_item.gainStarted:
                magic_obj = self.get_item_reader().get(gain_item.item)
                logger.info(u'Вырубаем палочками %s(%i) %i (%i, %i)' %
                            (magic_obj.name, gain_item.materialCount,
                             gain_item.id, gain_item.x, gain_item.y))

                while gain_item.materialCount:
                    magic_event = Magic(objId=gain_item.id)
                    events.append(magic_event)
                    gain_item.materialCount -= 1
                    self.get_game_state().get_state().magic.used += 1
                    self.get_game_state().add_storage(magic_obj.material, 1)
                    self.get_game_state().remove_storage(u'@MAGIC_WAND', 1)

                    # Если уже использовали 500 палочек, то прекращаем вырубку ресурса
                    if self.get_game_state().get_state(
                    ).magic.used == self.magic_limit:
                        break

                    # Если нет палочек в наличии, то прекращаем вырубку ресурса
                    if not self.get_game_state().count_storage(u'@MAGIC_WAND'):
                        self.get_game_state().set_signal(u'hell_coll', True)
                        break

                # Если вырубили до конца, то ставим ящик вместо дерева
                if not gain_item.materialCount:
                    if hasattr(magic_obj, 'box'):
                        box_item = self.get_item_reader().get(magic_obj.box)
                        new_obj = dict2obj({
                            'item': magic_obj.box,
                            'type': 'pickup',
                            'id': gain_item.id,
                            'x': gain_item.x,
                            'y': gain_item.y
                        })
                        self.get_game_state().remove_object_by_id(gain_item.id)
                        self.get_game_state().append_object(new_obj)
                        logger.info(u'%s превращён в %s' %
                                    (magic_obj.name, box_item.name))
                    else:
                        self.get_game_state().remove_object_by_id(gain_item.id)

            # Если уже использовали 500 палочек, то прекращаем поиск ресурсов
            if self.get_game_state().get_state(
            ).magic.used == self.magic_limit:
                break

            # Если нет палочек в наличии, то прекращаем вырубку ресурса
            if not self.get_game_state().count_storage(u'@MAGIC_WAND'):
                self.get_game_state().set_signal(u'hell_coll', True)
                break

        self.get_events_sender().send_game_pack_events(events)

        # Если получен сигнал, что нужны палочки для вырубки, значит обмениваем ад, чтобы на складе
        if self.get_game_state().get_signal(u'hell_coll'):
            # Адская коллекция
            hell_coll = u'C_34'

            coll_obj = self.get_item_reader().get(hell_coll)
            # Количество коллекций на складе
            hell_count = self.get_game_state().count_collection(coll_obj.items)
            # Необходимое количество коллекций, чтобы добить палочками лимит на сутки
            hell_need = (
                self.magic_limit - self.get_game_state().get_state().magic.used
                - self.get_game_state().count_storage(u'@MAGIC_WAND')) / 15 + 1

            # Берем минимум сколько можем обменять: либо сколько надо, либо сколько есть
            delta = long(min([hell_count, hell_need]))

            changed_colls = self.get_params().changed_colls
            # Если у нас задан минимум для это коллекции, то берем с учетом минимума
            for changed_coll in changed_colls:
                if changed_coll.name == hell_coll and changed_coll.min < hell_count:
                    delta = long(
                        min([hell_count - changed_coll.min, hell_need]))

            # Если есть, что менять
            if delta:
                logger.info(u'Обменяли %s %i шт' % (coll_obj.name, delta))
                exchange_coll_event = GameExchangeCollection(itemId=hell_coll,
                                                             count=delta)
                self.get_events_sender().send_game_events(
                    [exchange_coll_event])

                # Списываем коллекции
                self.get_game_state().remove_collection(coll_obj.items, delta)

                # Добавляем палочки на склад
                for prize in coll_obj.prizes:
                    self.get_game_state().add_storage(prize.item,
                                                      prize.count * delta)

                # Снимаем сигнал на создание палочек
                self.get_game_state().set_signal(u'hell_coll', False)