Beispiel #1
0
def __select_gacha_thing(rate_conf):
    """选择gacha的卡
        当rate_conf为dict时:rate_conf 有两层:例如free_rate, charge_rate
        当rate_conf为list时:rate_conf 只有层:类似::[('171_card',20),('172_card',10)]
    """
    #根据配置选出武将的id
    num = 1
    if isinstance(rate_conf, dict):
        #随机选取那一层
        select_level_list = [(level_k, level_v['weight'])
                             for level_k, level_v in rate_conf.iteritems()]
        select_level = utils.get_item_by_random_simple(select_level_list)
        rate_conf_select = copy.deepcopy(rate_conf[select_level])
        if 'weight' in rate_conf_select:
            rate_conf_select.pop('weight')
        select_level_list_second = [
            (level_k, level_v['weight'])
            for level_k, level_v in rate_conf_select.iteritems()
        ]
        select_level_second = utils.get_item_by_random_simple(
            select_level_list_second)
        thing_id = rate_conf_select[select_level_second]['id']
        num = rate_conf_select[select_level_second].get('num', 1)
    elif isinstance(rate_conf, list):
        thing_id = utils.get_item_by_random_simple(rate_conf)
    #结果返回
    return thing_id, num
Beispiel #2
0
def __select_gacha_multi_cards(rate_conf, gacha_cnt):
    """
    选择gacha多连抽的卡
    """
    cards = []
    select_level_list = [(level_k, level_v['weight'])
                         for level_k, level_v in rate_conf.iteritems()]
    for i in range(gacha_cnt):
        #获取抽奖的选卡
        select_level = utils.get_item_by_random_simple(select_level_list)
        rate_conf_select = copy.deepcopy(rate_conf[select_level])
        #将权重剔除 方便后面计算
        if 'weight' in rate_conf_select:
            rate_conf_select.pop('weight')
        select_level_list_second = [
            (level_k, level_v['weight'])
            for level_k, level_v in rate_conf_select.iteritems()
        ]
        select_level_second = utils.get_item_by_random_simple(
            select_level_list_second)
        select_cards_list = rate_conf_select[select_level_second]['cards']
        select_card = utils.get_item_by_random(select_cards_list)
        #格式化返回
        if isinstance(select_card, str):
            #以前的代码  暂未发现缝合要求的格式  过段时间看 能否删除
            cid = select_card
            clv = 1
        else:
            #目前配置中有的配置格式
            cid = select_card[0]
            clv = int(select_card[1])
        cards.append((cid, clv))
    return cards
Beispiel #3
0
def __select_gacha_multi_cards(rate_conf, gacha_cnt):
    """
    选择gacha多连抽的卡
    """
    cards = []
    select_level_list = [(level_k,level_v['weight']) for level_k,level_v in rate_conf.iteritems()]
    for i in range(gacha_cnt):
        #获取抽奖的选卡
        select_level = utils.get_item_by_random_simple(select_level_list)
        rate_conf_select = copy.deepcopy(rate_conf[select_level])
        #将权重剔除 方便后面计算
        if 'weight' in rate_conf_select:
            rate_conf_select.pop('weight')
        select_level_list_second = [(level_k,level_v['weight']) for level_k,level_v in rate_conf_select.iteritems()]
        select_level_second = utils.get_item_by_random_simple(select_level_list_second)
        select_cards_list = rate_conf_select[select_level_second]['cards']
        select_card = utils.get_item_by_random(select_cards_list)
        #格式化返回
        if isinstance(select_card,str):
            #以前的代码  暂未发现缝合要求的格式  过段时间看 能否删除
            cid = select_card
            clv = 1
        else:
            #目前配置中有的配置格式
            cid = select_card[0]
            clv = int(select_card[1])
        cards.append((cid, clv))
    return cards
Beispiel #4
0
def more_dungeon_drop(dungeon_type, floor_id, room_id, times=1):
    """  运营活动 特定时间   指定战场 额外掉落物品

    Args:
        dungeon_type   战场类型 
        floor_id
        room_id
        times          需要随机掉落几次

    Retruns:
        {
            'card':{
                '1_card': 4,
                '2_card': 5,
            },
            'soul':{
                '1_card': 10,
                '2_equip_1': 1,
            },
            'gold':{
                'gold': 50,
            }
            .....

        }
    """
    more_drop_conf = game_config.operat_config.get('more_drop_conf')
    if not more_drop_conf:
        return {}
    drop_info = {}
    for each_conf in more_drop_conf.values():
        now_str = datetime_toString(datetime.datetime.now())
        start_time = each_conf.get("start_time", 0)
        end_time = each_conf.get("end_time", 0)
        # 开发时间
        if now_str > end_time or now_str < start_time:
            continue
        # 指定战场类型开放
        if not dungeon_type in each_conf.get('dungeon', {}):
            continue
        # 指定战场开放
        if each_conf['dungeon'][dungeon_type] != 'all' and '-'.join(
            [floor_id, room_id]) not in each_conf['dungeon'][dungeon_type]:
            continue
        for thing_id, thing_drop_conf in each_conf.get('drop_things',
                                                       {}).items():
            num = 0
            for cnt in range(times):
                if not utils.is_happen(thing_drop_conf.get('drop_rate', 0)):
                    continue
                num += utils.get_item_by_random_simple(thing_drop_conf['num'])
            if num > 0:
                thing_type = thing_drop_conf['type']
                drop_info.setdefault(thing_type, {})
                thing_id = thing_id.replace('Soul', '')
                drop_info[thing_type][thing_id] = drop_info[thing_type].get(
                    thing_id, 0) + num
    return drop_info
Beispiel #5
0
def more_dungeon_drop(dungeon_type, floor_id, room_id, times=1):
    """  运营活动 特定时间   指定战场 额外掉落物品

    Args:
        dungeon_type   战场类型 
        floor_id
        room_id
        times          需要随机掉落几次

    Retruns:
        {
            'card':{
                '1_card': 4,
                '2_card': 5,
            },
            'soul':{
                '1_card': 10,
                '2_equip_1': 1,
            },
            'gold':{
                'gold': 50,
            }
            .....

        }
    """
    more_drop_conf = game_config.operat_config.get('more_drop_conf')
    if not more_drop_conf:
        return {}
    drop_info = {}
    for each_conf in more_drop_conf.values():
        now_str = datetime_toString(datetime.datetime.now())
        start_time = each_conf.get("start_time", 0)
        end_time = each_conf.get("end_time", 0)
        # 开发时间
        if now_str > end_time or now_str < start_time:
            continue
        # 指定战场类型开放
        if not dungeon_type in each_conf.get('dungeon', {}):
            continue
        # 指定战场开放
        if each_conf['dungeon'][dungeon_type] != 'all' and '-'.join([floor_id, room_id]) not in each_conf['dungeon'][dungeon_type]:
            continue
        for thing_id, thing_drop_conf in each_conf.get('drop_things', {}).items():
            num = 0
            for cnt in range(times):
                if not utils.is_happen(thing_drop_conf.get('drop_rate', 0)):
                    continue
                num += utils.get_item_by_random_simple(thing_drop_conf['num'])
            if num > 0:
                thing_type = thing_drop_conf['type']
                drop_info.setdefault(thing_type, {})
                thing_id = thing_id.replace('Soul', '')
                drop_info[thing_type][thing_id] = drop_info[thing_type].get(thing_id, 0) + num
    return drop_info
Beispiel #6
0
    def get_consume_award(self, coin):
        try:
            #获取运营配置的消耗奖励
            consume_award_conf = copy.deepcopy(
                self.game_config.operat_config.get("consume_award"))
            if not consume_award_conf:
                return
            #获取消耗奖励的内容
            user_property_obj = UserProperty.get(self.uid)
            consume_award_info = user_property_obj.consume_award_info
            old_consume_award_info = copy.deepcopy(consume_award_info)
            #遍历查找奖励内容
            for gift_id in consume_award_conf:
                gift_conf = consume_award_conf[gift_id]
                start_time = gift_conf.get('start_time')
                end_time = gift_conf.get('end_time', '2111-11-11 11:11:11')
                now_str = datetime_toString(datetime.datetime.now())
                #未开放或已过期的礼包
                if now_str > end_time or now_str < start_time:
                    continue
                if gift_id not in consume_award_info:
                    consume_award_info[gift_id] = {
                        'consume_coin': coin,
                        'has_got_cnt': 0,  # 已领取的次数
                    }
                else:
                    consume_award_info[gift_id]['consume_coin'] += coin

                #金额未达到
                if consume_award_info[gift_id]['consume_coin'] - gift_conf.get(
                        'consume_coin', 0) < 0:
                    continue
                #满足条件,发奖励

                #已经领取过的礼包
                print('chenhaiou gift_id: ', gift_id)
                # 如果有一次消耗元宝超过两倍 gift_conf['consume_coin']
                for cnt in range(consume_award_info[gift_id]['consume_coin'] /
                                 gift_conf.get('consume_coin', 0)):
                    consume_award_info[gift_id]['has_got_cnt'] += 1
                    if gift_conf.get('award', []):
                        msg = gift_conf.get('name', '') + utils.get_msg(
                            'operat', 'consume_award', self).format(
                                gift_conf.get('consume_coin', 0))
                        for award_warp in gift_conf['award'].values():
                            award = utils.get_item_by_random_simple(award_warp)
                            self.add_gift_by_dict(award, msg)
                consume_award_info[gift_id]['consume_coin'] %= gift_conf.get(
                    'consume_coin', 0)
            if old_consume_award_info != consume_award_info:
                user_property_obj.put()
        except:
            print traceback.format_exc()
Beispiel #7
0
def __select_gacha_thing(rate_conf):
    """选择gacha的卡
        当rate_conf为dict时:rate_conf 有两层:例如free_rate, charge_rate
        当rate_conf为list时:rate_conf 只有层:类似::[('171_card',20),('172_card',10)]
    """
    #根据配置选出武将的id
    num = 1
    if isinstance(rate_conf, dict):
        #随机选取那一层
        select_level_list = [(level_k,level_v['weight']) for level_k,level_v in rate_conf.iteritems()]
        select_level = utils.get_item_by_random_simple(select_level_list)
        rate_conf_select = copy.deepcopy(rate_conf[select_level])
        if 'weight' in rate_conf_select:
            rate_conf_select.pop('weight')
        select_level_list_second = [(level_k,level_v['weight']) for level_k,level_v in rate_conf_select.iteritems()]
        select_level_second = utils.get_item_by_random_simple(select_level_list_second)
        thing_id = rate_conf_select[select_level_second]['id']
        num = rate_conf_select[select_level_second].get('num', 1)
    elif isinstance(rate_conf, list):
        thing_id = utils.get_item_by_random_simple(rate_conf)
    #结果返回
    return thing_id, num
Beispiel #8
0
    def get_consume_award(self, coin):
        try:
            #获取运营配置的消耗奖励
            consume_award_conf = copy.deepcopy(self.game_config.operat_config.get("consume_award"))
            if not consume_award_conf:
                return
            #获取消耗奖励的内容
            user_property_obj = UserProperty.get(self.uid)
            consume_award_info = user_property_obj.consume_award_info
            old_consume_award_info = copy.deepcopy(consume_award_info)
            #遍历查找奖励内容
            for gift_id in consume_award_conf:
                gift_conf = consume_award_conf[gift_id]
                start_time = gift_conf.get('start_time')
                end_time = gift_conf.get('end_time','2111-11-11 11:11:11')
                now_str = datetime_toString(datetime.datetime.now())
                #未开放或已过期的礼包
                if now_str > end_time or now_str < start_time:
                    continue
                if gift_id not in consume_award_info:
                    consume_award_info[gift_id] = {
                                              'consume_coin': coin,
                                              'has_got_cnt': 0,   # 已领取的次数
                    }
                else:
                    consume_award_info[gift_id]['consume_coin'] += coin

                #金额未达到
                if consume_award_info[gift_id]['consume_coin'] - gift_conf.get('consume_coin',0) < 0:
                    continue
                #满足条件,发奖励

                #已经领取过的礼包
                print('chenhaiou gift_id: ', gift_id)
                # 如果有一次消耗元宝超过两倍 gift_conf['consume_coin']    
                for cnt in range(consume_award_info[gift_id]['consume_coin'] / gift_conf.get('consume_coin',0)):
                    consume_award_info[gift_id]['has_got_cnt'] += 1
                    if gift_conf.get('award', []):
                        msg =  gift_conf.get('name', '') + utils.get_msg('operat', 'consume_award', self).format(gift_conf.get('consume_coin',0))
                        for award_warp in gift_conf['award'].values():
                            award = utils.get_item_by_random_simple(award_warp)
                            self.add_gift_by_dict(award, msg)
                consume_award_info[gift_id]['consume_coin'] %= gift_conf.get('consume_coin',0)
            if old_consume_award_info != consume_award_info:
                user_property_obj.put()
        except:
            print traceback.format_exc()
Beispiel #9
0
def gacha(request):
    """
    测试求将
    """
    
    data = {
        'plus_count': 0,
    }
    gacha_type = request.REQUEST.get("type",'')
    data['type'] = gacha_type
    rate_conf = game_config.gacha_config[gacha_type]
    count = request.REQUEST.get("count")
    if not count:
        count = '1'
    count = int(count)
    data['count'] = count
    i = 0
    card_dict = {}
    new_things = []
    new_cards_ex = []
    while i < count:
        thing_id, num = __select_gacha_thing(rate_conf)
        new_things.append((thing_id, num))
        i += 1

    card_update_config = game_config.card_update_config
    CARD_CATEGORY = {'0':u'攻击型','1':u'防御型','2':u'血型','3':u'回复型',\
    '4':u'平衡型','5':u'超生命型','6':u'超攻击型','7':u'转生道具','8':u'强化合成','9':u'超防御型','10':u'超回复型'}
    for cid, clv in new_cards:
        card_obj = Card.get(cid)
        category = card_obj.category
        quality = ''
        if not category or category not in ['7','8']:
            category = utils.get_item_by_random_simple(card_update_config['card_category_weight'])
            #平衡型是没有品质
            if category != '4':
                quality = utils.get_item_by_random_simple(card_update_config['card_quality_weight'])
        keys_str = '%s:%s:%s' % (cid,category,quality)
        if keys_str in card_dict and category == card_dict[keys_str]['category'] and quality == card_dict[keys_str]['quality']:
            card_dict[keys_str]['count'] += 1
        else:
            card_dict[keys_str] = {
                'name':card_obj.name,
                'star':card_obj.star,
                'ctype':card_obj.ctype,
                'cid':cid,
                'lv':clv,
                'count':1,
                'plus_num':0,
                'category':category,
                "category_name":CARD_CATEGORY[category],
                'quality':quality,
            }

        #记录抽到plus属性的个数
        #cardmod_obj = Card.get(cid)
#        if utils.is_happen(float(cardmod_obj.pl_rate)):
#            plus_type = random.choice(['pl_attack','pl_hp','pl_recover'])
#        elif gacha_type == 'free_rate':
#            plus_type = utils.getPlusCard("gacha_free")
#        elif gacha_type == 'charge_rate':
#            plus_type = utils.getPlusCard("gacha_charge")
#        if plus_type:
#            card_dict[cid]['plus_num'] += 1
#            data['plus_count'] += 1

    order = request.REQUEST.get('order')
    data['order'] = order
    card_list = sorted(card_dict.items(),key=lambda x:x[1][order],reverse=True)
    data['card_list'] = card_list
    return render_to_response('tool/gacha.html',{"data":data},RequestContext(request))
Beispiel #10
0
def gacha(request):
    """
    测试求将
    """

    data = {
        'plus_count': 0,
    }
    gacha_type = request.REQUEST.get("type", '')
    data['type'] = gacha_type
    rate_conf = game_config.gacha_config[gacha_type]
    count = request.REQUEST.get("count")
    if not count:
        count = '1'
    count = int(count)
    data['count'] = count
    i = 0
    card_dict = {}
    new_things = []
    new_cards_ex = []
    while i < count:
        thing_id, num = __select_gacha_thing(rate_conf)
        new_things.append((thing_id, num))
        i += 1

    card_update_config = game_config.card_update_config
    CARD_CATEGORY = {'0':u'攻击型','1':u'防御型','2':u'血型','3':u'回复型',\
    '4':u'平衡型','5':u'超生命型','6':u'超攻击型','7':u'转生道具','8':u'强化合成','9':u'超防御型','10':u'超回复型'}
    for cid, clv in new_cards:
        card_obj = Card.get(cid)
        category = card_obj.category
        quality = ''
        if not category or category not in ['7', '8']:
            category = utils.get_item_by_random_simple(
                card_update_config['card_category_weight'])
            #平衡型是没有品质
            if category != '4':
                quality = utils.get_item_by_random_simple(
                    card_update_config['card_quality_weight'])
        keys_str = '%s:%s:%s' % (cid, category, quality)
        if keys_str in card_dict and category == card_dict[keys_str][
                'category'] and quality == card_dict[keys_str]['quality']:
            card_dict[keys_str]['count'] += 1
        else:
            card_dict[keys_str] = {
                'name': card_obj.name,
                'star': card_obj.star,
                'ctype': card_obj.ctype,
                'cid': cid,
                'lv': clv,
                'count': 1,
                'plus_num': 0,
                'category': category,
                "category_name": CARD_CATEGORY[category],
                'quality': quality,
            }

        #记录抽到plus属性的个数
        #cardmod_obj = Card.get(cid)


#        if utils.is_happen(float(cardmod_obj.pl_rate)):
#            plus_type = random.choice(['pl_attack','pl_hp','pl_recover'])
#        elif gacha_type == 'free_rate':
#            plus_type = utils.getPlusCard("gacha_free")
#        elif gacha_type == 'charge_rate':
#            plus_type = utils.getPlusCard("gacha_charge")
#        if plus_type:
#            card_dict[cid]['plus_num'] += 1
#            data['plus_count'] += 1

    order = request.REQUEST.get('order')
    data['order'] = order
    card_list = sorted(card_dict.items(),
                       key=lambda x: x[1][order],
                       reverse=True)
    data['card_list'] = card_list
    return render_to_response('tool/gacha.html', {"data": data},
                              RequestContext(request))