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
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
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
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
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
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()
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
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()
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))
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))