コード例 #1
0
ファイル: dungeon.py プロジェクト: flamedancer/local_qz
def wipe_out(rk_user, params):
    '''
    扫荡
        玩家能够在已经完美过关的关卡上使用扫荡功能,扫荡不用进入战斗画面,直接返回关卡奖励
        与普通战斗不同的是扫荡并不需要更新战场的关卡信息,
    params: 
        dungeon_type:'normal'  战场类型,有普通战场 normal , 试炼 daily
        floor_id:'1'
        room_id:'1'
        do_times: '1'  扫荡次数
    '''     

    # ------------------------------参数check start-------------------------
    d_type = params.get('dungeon_type')
    floor_id = params.get('floor_id')
    room_id  = params.get('room_id')
    do_times = params.get('do_times')
    if d_type not in ['normal', 'daily'] or not floor_id or not room_id:
        return 6, {'msg':utils.get_msg('dungeon', 'invalid_params')}
    try:
        do_times = int(do_times)
    except ValueError:
        return 6, {'msg':utils.get_msg('dungeon', 'invalid_params')}
    if do_times < 1 or do_times > 10:
        return 6, {'msg':utils.get_msg('dungeon', 'invalid_params')}

    # 读配置
    conf_dict = {
        'normal': game_config.normal_dungeon_config,
        'daily': game_config.daily_dungeon_config
    }
    dungeon_config = conf_dict[d_type]

    # 战场不存在 
    try:
        dungeon_config[floor_id]['rooms'][room_id]
    except KeyError:
        return 6,{'msg':utils.get_msg('dungeon', 'invalid_dungeon')}
    # ------------------------------参数check end----------------------------

    # ------------------------------扫荡逻辑check start----------------
    user_dungeon = rk_user.user_dungeon
    has_played_info = user_dungeon.has_played_info
    user_property = rk_user.user_property
    # 玩家未达到15级,不开启扫荡
    open_lv = game_config.user_init_config['open_lv'].get('wipe_out', 0)
    if user_property.lv < open_lv:
        return 11,{'msg':utils.get_msg('dungeon', 'wipe_out_open_lv') % open_lv}
    # vip未达到4级,不开启多次扫荡
    open_lv = game_config.user_init_config['open_lv'].get('vip_multi_wipe_out', 0)
    if do_times > 1 and user_property.vip_cur_level < open_lv:
        return 11,{'msg':utils.get_msg('dungeon', 'vip_wipe_out') % open_lv}
    # 未达到此战场
    try:
        has_played_info[d_type][floor_id]['rooms'][room_id]
    except KeyError:
        return 11,{'msg':utils.get_msg('dungeon', 'not_arrived')}
    # 没达到3星
    if not has_played_info[d_type][floor_id]['rooms'][room_id]['perfect']:
        return 11,{'msg':utils.get_msg('dungeon', 'not_three_star')}
    # 当前扫荡券不足
    user_pack = rk_user.user_pack
    if not user_pack.is_props_enough('24_props', do_times):
        return 11,{'msg':utils.get_msg('dungeon', 'wipe_out_not_enough')}
    floor_config = dungeon_config[floor_id]
    room_config = dungeon_config[floor_id]['rooms'][room_id]
    # 检查用户体力是否足够
    need_stamina = int(room_config['stamina']) * do_times
    if user_property.stamina < need_stamina:
        raise GameLogicError('user','not_enough_stamina')
    
    # 进入战场次数用完,不能扫荡,  或者更新repeat_info的当天日期
    if user_dungeon.check_limit_dungeon(rk_user,params) is False:
        raise GameLogicError('dungeon', 'invalid_limit_dungeon')
    # 计算能够扫荡次数
    
    if d_type == 'normal':
        try:  #  判断dungeon_repeat_info中有无此关卡记录
            user_dungeon.dungeon_repeat_info[d_type][floor_id][room_id]
        except KeyError:
            # 无此关卡记录时,把此关卡今日完成次数置零
            user_dungeon.dungeon_repeat_info      \
                .setdefault(d_type, {})           \
                .setdefault(floor_id, {})         \
                .setdefault(room_id, 0)
            user_dungeon.put()
        can_make_copy_cnt = room_config['can_make_copy_cn']
        has_played_cnt = user_dungeon.dungeon_repeat_info[d_type][floor_id][room_id]
    elif d_type == 'daily':
        try:  #  判断dungeon_repeat_info中有无此关卡记录
            user_dungeon.dungeon_repeat_info[d_type][floor_id]
        except KeyError:
            # 无此关卡记录时,把此关卡今日完成次数置零
            user_dungeon.dungeon_repeat_info      \
                .setdefault(d_type, {})           \
                .setdefault(floor_id, 0)
            user_dungeon.put()
        can_make_copy_cnt = floor_config['can_make_copy_cn']
        has_played_cnt = user_dungeon.dungeon_repeat_info[d_type][floor_id]

    can_wipe_out_cnt = can_make_copy_cnt - has_played_cnt

    data = {}
    # 剩余战场次数不够扫荡n次
    if can_wipe_out_cnt < do_times:
        return 11,{'msg':utils.get_msg('dungeon', 'cant_do_multi_times') % do_times}
    data['can_wipe_out_cnt'] = can_wipe_out_cnt
    # ------------------------------扫荡逻辑check end----------------

    # 能扫荡次数和vip等级有关
    #if utils.get_today_str() == user_property.property_info['recover_times']['today_str']:
    #    wipe_out_times = user_property.property_info.get('wipe_out_times', 0)
    #    vip_lv = user_property.vip_cur_level
    #    can_wipe_out_cnt = game_config.user_vip_config[str(vip_lv)]['can_wipe_out_cnt']
    #    if can_wipe_out_cnt - wipe_out_times < do_times:
    #        return 11,{'msg':utils.get_msg('dungeon', 'vip_wipe_out')}
    #    user_property.property_info['wipe_out_times'] += do_times
    #else:
    #    user_property.property_info['wipe_out_times'] = do_times
    #    vip.check_limit_recover(rk_user, 'wipe_out')  # 更新一下,防止出错
    #user_property.put()

    # ------------------------------添加扫荡物品 start----------------
    # 扫荡战利品
    get_goods = {
        'exp': 0,
        'exp_point': 0,
        'gold': 0,
        'card': {},
        'equip': {},
        'soul':{
            'card': {},
            'equip': {},
        },
        'mat': {},
        'props': {},
    }
    # 扫荡一次能够得到的经验,卡经验点,和钱币
    get_goods['exp'] += room_config.get('exp', 0) * do_times
    get_goods['exp_point'] += room_config.get('exp_point', 0) * do_times
    get_goods['gold'] += room_config.get('gold', 0) * do_times
    
    ########  运营活动 特定时间额外掉落物品   万恶的代码
    more_drop = activity.more_dungeon_drop(d_type, floor_id, room_id, times=do_times)
    if more_drop:
        for thing_type, things_id_num in more_drop.items():
            if thing_type == 'gold':
                get_goods['gold'] += more_drop['gold']['num']
                continue
            for thing_id, num in things_id_num.items():
                if thing_type == 'soul':
                    if 'card' in thing_id:
                        soul_type = 'card'
                    elif 'equip' in thing_id:
                        soul_type = 'equip'
                    get_goods[thing_type][soul_type][thing_id] = get_goods[thing_type][soul_type].get(thing_id, 0) + num
                else:
                    get_goods[thing_type][thing_id] = get_goods[thing_type].get(thing_id, 0) + num
    ################### ############
    
    # 扫荡能够得到的物品
    drop_info = _pack_drop_info(room_config.get('drop_info', {}))
    invisible_drop = _pack_drop_info(room_config.get('invisible_drop', {}))
    drop_info.extend(invisible_drop)
    # 有掉落物品(包括可见和不可见)时计算掉落, 不用战斗所以不区分可见不可见
    if drop_info: # sample  ['12002_equip', '5_card_soul', '53001_equip_1_soul', '6_card', '23_props', '8_props']
        drop_info = list(set(drop_info))  # list去重
        drop_info_config = game_config.drop_info_config['normal_dungeon']
        # 检查战场掉落配置中是否有此物品
        for goods_id in drop_info:
            if 'soul' in goods_id:
                if goods_id[:-5] not in drop_info_config['soul']:
                    return 11,{'msg':utils.get_msg('dungeon', 'no_this_goods')}
            else:
                if goods_id not in drop_info_config:
                    return 11,{'msg':utils.get_msg('dungeon', 'no_this_goods')}
        # 计算掉落数量
        for n in range(do_times):
            for goods_id in drop_info:
                if 'soul' in goods_id:
                    goods_id = goods_id[:-5]  # 去掉'_soul'后缀
                    value_config = drop_info_config['soul'][goods_id].get('visible', drop_info_config['soul'][goods_id].get('invisible', 0))
                    # 根据配置概率判断是否得到
                    if utils.is_happen(value_config[1]):
                        num = random.randint(value_config[0][0], value_config[0][1])
                        if 'card' in goods_id:
                            soul_type = 'card'
                        elif 'equip' in goods_id:
                            soul_type = 'equip'
                        else:
                            continue
                        if goods_id not in get_goods['soul'][soul_type]:
                            get_goods['soul'][soul_type][goods_id] = num
                        else:
                            get_goods['soul'][soul_type][goods_id] += num
                    else:
                        continue
                else:
                    value_config = drop_info_config[goods_id].get('visible', drop_info_config[goods_id].get('invisible', 0))
                    # 根据配置概率判断是否得到
                    if utils.is_happen(value_config[1]):
                        num = random.randint(value_config[0][0], value_config[0][1])
                        for t in ['card', 'equip', 'props', 'mat']:
                            if t in goods_id:
                                get_type = t
                        if goods_id not in get_goods[get_type]:
                            get_goods[get_type][goods_id] = num
                        else:
                            get_goods[get_type][goods_id] += num
                    else:
                        continue

    # 添加must_drop必掉物品
    md = room_config.get('must_drop', {})
    for goods_type in md:
        if goods_type == 'soul':
            for key in md[goods_type]:
                if 'card' in key:
                    soul_type = 'card'
                elif 'equip' in key:
                    soul_type = 'equip'
                else:
                    continue
                if key in get_goods[goods_type][soul_type]:
                    get_goods[goods_type][soul_type][key] += md[goods_type][key]
                else:
                    get_goods[goods_type][soul_type][key] = md[goods_type][key]
        else:
            for key in md[goods_type]:
                if key in get_goods[goods_type]:
                    get_goods[goods_type][key] += md[goods_type][key]
                else:
                    get_goods[goods_type][key] = md[goods_type][key]

    # ------------------------------添加扫荡物品 end----------------

    # 添加扫荡获得物品
    tmpdata = user_property.test_give_award(get_goods, where='wipe_out')
    # 减扫荡券
    user_pack.minus_props('24_props', do_times, 'wipe_out')
    # 扣体力
    user_property.minus_stamina(need_stamina)
    # 记录repeat info
    user_dungeon.add_repeat_cnt(d_type, floor_id, room_id, do_times)

    # 给前端
    data['get_exp'] = tmpdata['exp']
    data['get_exp_point'] = tmpdata['exp_point']
    data['get_gold'] = tmpdata['gold']
    data['get_card'] = tmpdata['card']
    data['get_equip'] = tmpdata['equip']
    data['get_souls'] = tmpdata['soul']
    data['get_material'] = tmpdata['mat']
    data['get_props'] = tmpdata['props']

    return 0, data
コード例 #2
0
ファイル: dungeon.py プロジェクト: flamedancer/local_qz
def wipe_out(rk_user, params):
    '''
    扫荡
        玩家能够在已经完美过关的关卡上使用扫荡功能,扫荡不用进入战斗画面,直接返回关卡奖励
        与普通战斗不同的是扫荡并不需要更新战场的关卡信息,
    params: 
        dungeon_type:'normal'  战场类型,有普通战场 normal , 试炼 daily
        floor_id:'1'
        room_id:'1'
        do_times: '1'  扫荡次数
    '''

    # ------------------------------参数check start-------------------------
    d_type = params.get('dungeon_type')
    floor_id = params.get('floor_id')
    room_id = params.get('room_id')
    do_times = params.get('do_times')
    if d_type not in ['normal', 'daily'] or not floor_id or not room_id:
        return 6, {'msg': utils.get_msg('dungeon', 'invalid_params')}
    try:
        do_times = int(do_times)
    except ValueError:
        return 6, {'msg': utils.get_msg('dungeon', 'invalid_params')}
    if do_times < 1 or do_times > 10:
        return 6, {'msg': utils.get_msg('dungeon', 'invalid_params')}

    # 读配置
    conf_dict = {
        'normal': game_config.normal_dungeon_config,
        'daily': game_config.daily_dungeon_config
    }
    dungeon_config = conf_dict[d_type]

    # 战场不存在
    try:
        dungeon_config[floor_id]['rooms'][room_id]
    except KeyError:
        return 6, {'msg': utils.get_msg('dungeon', 'invalid_dungeon')}
    # ------------------------------参数check end----------------------------

    # ------------------------------扫荡逻辑check start----------------
    user_dungeon = rk_user.user_dungeon
    has_played_info = user_dungeon.has_played_info
    user_property = rk_user.user_property
    # 玩家未达到15级,不开启扫荡
    open_lv = game_config.user_init_config['open_lv'].get('wipe_out', 0)
    if user_property.lv < open_lv:
        return 11, {
            'msg': utils.get_msg('dungeon', 'wipe_out_open_lv') % open_lv
        }
    # vip未达到4级,不开启多次扫荡
    open_lv = game_config.user_init_config['open_lv'].get(
        'vip_multi_wipe_out', 0)
    if do_times > 1 and user_property.vip_cur_level < open_lv:
        return 11, {'msg': utils.get_msg('dungeon', 'vip_wipe_out') % open_lv}
    # 未达到此战场
    try:
        has_played_info[d_type][floor_id]['rooms'][room_id]
    except KeyError:
        return 11, {'msg': utils.get_msg('dungeon', 'not_arrived')}
    # 没达到3星
    if not has_played_info[d_type][floor_id]['rooms'][room_id]['perfect']:
        return 11, {'msg': utils.get_msg('dungeon', 'not_three_star')}
    # 当前扫荡券不足
    user_pack = rk_user.user_pack
    if not user_pack.is_props_enough('24_props', do_times):
        return 11, {'msg': utils.get_msg('dungeon', 'wipe_out_not_enough')}
    floor_config = dungeon_config[floor_id]
    room_config = dungeon_config[floor_id]['rooms'][room_id]
    # 检查用户体力是否足够
    need_stamina = int(room_config['stamina']) * do_times
    if user_property.stamina < need_stamina:
        raise GameLogicError('user', 'not_enough_stamina')

    # 进入战场次数用完,不能扫荡,  或者更新repeat_info的当天日期
    if user_dungeon.check_limit_dungeon(rk_user, params) is False:
        raise GameLogicError('dungeon', 'invalid_limit_dungeon')
    # 计算能够扫荡次数

    if d_type == 'normal':
        try:  #  判断dungeon_repeat_info中有无此关卡记录
            user_dungeon.dungeon_repeat_info[d_type][floor_id][room_id]
        except KeyError:
            # 无此关卡记录时,把此关卡今日完成次数置零
            user_dungeon.dungeon_repeat_info      \
                .setdefault(d_type, {})           \
                .setdefault(floor_id, {})         \
                .setdefault(room_id, 0)
            user_dungeon.put()
        can_make_copy_cnt = room_config['can_make_copy_cn']
        has_played_cnt = user_dungeon.dungeon_repeat_info[d_type][floor_id][
            room_id]
    elif d_type == 'daily':
        try:  #  判断dungeon_repeat_info中有无此关卡记录
            user_dungeon.dungeon_repeat_info[d_type][floor_id]
        except KeyError:
            # 无此关卡记录时,把此关卡今日完成次数置零
            user_dungeon.dungeon_repeat_info      \
                .setdefault(d_type, {})           \
                .setdefault(floor_id, 0)
            user_dungeon.put()
        can_make_copy_cnt = floor_config['can_make_copy_cn']
        has_played_cnt = user_dungeon.dungeon_repeat_info[d_type][floor_id]

    can_wipe_out_cnt = can_make_copy_cnt - has_played_cnt

    data = {}
    # 剩余战场次数不够扫荡n次
    if can_wipe_out_cnt < do_times:
        return 11, {
            'msg': utils.get_msg('dungeon', 'cant_do_multi_times') % do_times
        }
    data['can_wipe_out_cnt'] = can_wipe_out_cnt
    # ------------------------------扫荡逻辑check end----------------

    # 能扫荡次数和vip等级有关
    #if utils.get_today_str() == user_property.property_info['recover_times']['today_str']:
    #    wipe_out_times = user_property.property_info.get('wipe_out_times', 0)
    #    vip_lv = user_property.vip_cur_level
    #    can_wipe_out_cnt = game_config.user_vip_config[str(vip_lv)]['can_wipe_out_cnt']
    #    if can_wipe_out_cnt - wipe_out_times < do_times:
    #        return 11,{'msg':utils.get_msg('dungeon', 'vip_wipe_out')}
    #    user_property.property_info['wipe_out_times'] += do_times
    #else:
    #    user_property.property_info['wipe_out_times'] = do_times
    #    vip.check_limit_recover(rk_user, 'wipe_out')  # 更新一下,防止出错
    #user_property.put()

    # ------------------------------添加扫荡物品 start----------------
    # 扫荡战利品
    get_goods = {
        'exp': 0,
        'exp_point': 0,
        'gold': 0,
        'card': {},
        'equip': {},
        'soul': {
            'card': {},
            'equip': {},
        },
        'mat': {},
        'props': {},
    }
    # 扫荡一次能够得到的经验,卡经验点,和钱币
    get_goods['exp'] += room_config.get('exp', 0) * do_times
    get_goods['exp_point'] += room_config.get('exp_point', 0) * do_times
    get_goods['gold'] += room_config.get('gold', 0) * do_times

    ########  运营活动 特定时间额外掉落物品   万恶的代码
    more_drop = activity.more_dungeon_drop(d_type,
                                           floor_id,
                                           room_id,
                                           times=do_times)
    if more_drop:
        for thing_type, things_id_num in more_drop.items():
            if thing_type == 'gold':
                get_goods['gold'] += more_drop['gold']['num']
                continue
            for thing_id, num in things_id_num.items():
                if thing_type == 'soul':
                    if 'card' in thing_id:
                        soul_type = 'card'
                    elif 'equip' in thing_id:
                        soul_type = 'equip'
                    get_goods[thing_type][soul_type][
                        thing_id] = get_goods[thing_type][soul_type].get(
                            thing_id, 0) + num
                else:
                    get_goods[
                        thing_type][thing_id] = get_goods[thing_type].get(
                            thing_id, 0) + num
    ################### ############

    # 扫荡能够得到的物品
    drop_info = _pack_drop_info(room_config.get('drop_info', {}))
    invisible_drop = _pack_drop_info(room_config.get('invisible_drop', {}))
    drop_info.extend(invisible_drop)
    # 有掉落物品(包括可见和不可见)时计算掉落, 不用战斗所以不区分可见不可见
    if drop_info:  # sample  ['12002_equip', '5_card_soul', '53001_equip_1_soul', '6_card', '23_props', '8_props']
        drop_info = list(set(drop_info))  # list去重
        drop_info_config = game_config.drop_info_config['normal_dungeon']
        # 检查战场掉落配置中是否有此物品
        for goods_id in drop_info:
            if 'soul' in goods_id:
                if goods_id[:-5] not in drop_info_config['soul']:
                    return 11, {
                        'msg': utils.get_msg('dungeon', 'no_this_goods')
                    }
            else:
                if goods_id not in drop_info_config:
                    return 11, {
                        'msg': utils.get_msg('dungeon', 'no_this_goods')
                    }
        # 计算掉落数量
        for n in range(do_times):
            for goods_id in drop_info:
                if 'soul' in goods_id:
                    goods_id = goods_id[:-5]  # 去掉'_soul'后缀
                    value_config = drop_info_config['soul'][goods_id].get(
                        'visible',
                        drop_info_config['soul'][goods_id].get('invisible', 0))
                    # 根据配置概率判断是否得到
                    if utils.is_happen(value_config[1]):
                        num = random.randint(value_config[0][0],
                                             value_config[0][1])
                        if 'card' in goods_id:
                            soul_type = 'card'
                        elif 'equip' in goods_id:
                            soul_type = 'equip'
                        else:
                            continue
                        if goods_id not in get_goods['soul'][soul_type]:
                            get_goods['soul'][soul_type][goods_id] = num
                        else:
                            get_goods['soul'][soul_type][goods_id] += num
                    else:
                        continue
                else:
                    value_config = drop_info_config[goods_id].get(
                        'visible',
                        drop_info_config[goods_id].get('invisible', 0))
                    # 根据配置概率判断是否得到
                    if utils.is_happen(value_config[1]):
                        num = random.randint(value_config[0][0],
                                             value_config[0][1])
                        for t in ['card', 'equip', 'props', 'mat']:
                            if t in goods_id:
                                get_type = t
                        if goods_id not in get_goods[get_type]:
                            get_goods[get_type][goods_id] = num
                        else:
                            get_goods[get_type][goods_id] += num
                    else:
                        continue

    # 添加must_drop必掉物品
    md = room_config.get('must_drop', {})
    for goods_type in md:
        if goods_type == 'soul':
            for key in md[goods_type]:
                if 'card' in key:
                    soul_type = 'card'
                elif 'equip' in key:
                    soul_type = 'equip'
                else:
                    continue
                if key in get_goods[goods_type][soul_type]:
                    get_goods[goods_type][soul_type][key] += md[goods_type][
                        key]
                else:
                    get_goods[goods_type][soul_type][key] = md[goods_type][key]
        else:
            for key in md[goods_type]:
                if key in get_goods[goods_type]:
                    get_goods[goods_type][key] += md[goods_type][key]
                else:
                    get_goods[goods_type][key] = md[goods_type][key]

    # ------------------------------添加扫荡物品 end----------------

    # 添加扫荡获得物品
    tmpdata = user_property.test_give_award(get_goods, where='wipe_out')
    # 减扫荡券
    user_pack.minus_props('24_props', do_times, 'wipe_out')
    # 扣体力
    user_property.minus_stamina(need_stamina)
    # 记录repeat info
    user_dungeon.add_repeat_cnt(d_type, floor_id, room_id, do_times)

    # 给前端
    data['get_exp'] = tmpdata['exp']
    data['get_exp_point'] = tmpdata['exp_point']
    data['get_gold'] = tmpdata['gold']
    data['get_card'] = tmpdata['card']
    data['get_equip'] = tmpdata['equip']
    data['get_souls'] = tmpdata['soul']
    data['get_material'] = tmpdata['mat']
    data['get_props'] = tmpdata['props']

    return 0, data
コード例 #3
0
ファイル: dungeon.py プロジェクト: flamedancer/local_qz
def enter_dungeon(rk_user, params, user_dungeon_obj, conf):
    """进入战场"""
    
    dungeon_type = params['dungeon_type']
    floor_id = params['floor_id']
    room_id = params['room_id']
    #增加进入战场打印
    print 'start_dun_%s:%s_%s_%s' % (str(rk_user.uid),dungeon_type,floor_id,room_id)

    ########  运营活动  特定时间内收益翻倍
    multiply = 1
    if dungeon_type == 'daily':
        multiply_income_conf = rk_user.game_config.operat_config.get("multiply_income", {}
        ).get("daily_dungeon", {}).get(floor_id)
        multiply = multiply_income(multiply_income_conf)
    ########  

    last_info = {}

    data = {}
    #记录战斗的唯一标识
    dungeon_uid = utils.create_gen_id()
    data['dungeon_uid'] = dungeon_uid
    last_info['dungeon_uid'] = dungeon_uid
    #新用户前7天失败不扣体力 付费用户失败不扣体力
    need_stamina = int(conf['stamina'])
    last_info['dungeon_stamina'] = need_stamina
    #计算每一个小节的敌将和掉落信息
    steps_res = calculate_steps(params, conf, rk_user, multiply)

    ########  运营活动 特定时间额外掉落物品 扫荡时也有类似逻辑  万恶的代码
    more_drop = activity.more_dungeon_drop(dungeon_type, floor_id, room_id, times=1)
    if more_drop:
        all_drop_info = steps_res['all_drop_info']
        for thing_type, things_id_num in more_drop.items():
            if thing_type == 'gold':
                steps_res['dungeon_gold'] = steps_res['dungeon_gold'] + more_drop['gold']['num']
                continue
            all_drop_info.setdefault(thing_type, {})
            for thing_id, num in things_id_num.items():
                if thing_type == 'soul':
                    if 'card' in thing_id:
                        soul_type = 'card'
                    elif 'equip' in thing_id:
                        soul_type = 'equip'
                    all_drop_info[thing_type].setdefault(soul_type, {})
                    all_drop_info[thing_type][soul_type][thing_id] = all_drop_info[thing_type][soul_type].get(thing_id, 0) + num
                else:
                    all_drop_info[thing_type][thing_id] = all_drop_info[thing_type].get(thing_id, 0) + num
    ###################  

    #格式化返回的数据
    data['all_drop_info'] = steps_res['all_drop_info']
    data['steps_info'] = steps_res['steps_info']
    data['dungeon_uid'] = last_info['dungeon_uid']
    data['exp_point'] = steps_res['exp_point']
    data['boss_id'] = conf['boss'][0]
    #将本次计算的信息作为历史信息保存
    last_info['floor_id'] = floor_id
    last_info['room_id'] = room_id
    last_info['dungeon_type'] = dungeon_type
    last_info['all_drop_info'] = steps_res['all_drop_info']
    #######################################################################################
    last_info['total_gold'] = steps_res['total_gold']
    last_info['dungeon_gold'] = steps_res['dungeon_gold']
    last_info['exp_point'] = steps_res['exp_point']
    #######################################################################################
    last_info["dungeon_data"] = data
    now = datetime.datetime.now()
    today_str = now.strftime('%Y-%m-%d')
    last_info["limit_time"] = today_str
    last_info['exp'] = steps_res['exp']

    user_dungeon_obj.dungeon_info['last'] = last_info
    user_dungeon_obj.put()
    #将结果返回给前端
    return data
コード例 #4
0
ファイル: dungeon.py プロジェクト: flamedancer/local_qz
def enter_dungeon(rk_user, params, user_dungeon_obj, conf):
    """进入战场"""

    dungeon_type = params['dungeon_type']
    floor_id = params['floor_id']
    room_id = params['room_id']
    #增加进入战场打印
    print 'start_dun_%s:%s_%s_%s' % (str(
        rk_user.uid), dungeon_type, floor_id, room_id)

    ########  运营活动  特定时间内收益翻倍
    multiply = 1
    if dungeon_type == 'daily':
        multiply_income_conf = rk_user.game_config.operat_config.get(
            "multiply_income", {}).get("daily_dungeon", {}).get(floor_id)
        multiply = multiply_income(multiply_income_conf)
    ########

    last_info = {}

    data = {}
    #记录战斗的唯一标识
    dungeon_uid = utils.create_gen_id()
    data['dungeon_uid'] = dungeon_uid
    last_info['dungeon_uid'] = dungeon_uid
    #新用户前7天失败不扣体力 付费用户失败不扣体力
    need_stamina = int(conf['stamina'])
    last_info['dungeon_stamina'] = need_stamina
    #计算每一个小节的敌将和掉落信息
    steps_res = calculate_steps(params, conf, rk_user, multiply)

    ########  运营活动 特定时间额外掉落物品 扫荡时也有类似逻辑  万恶的代码
    more_drop = activity.more_dungeon_drop(dungeon_type,
                                           floor_id,
                                           room_id,
                                           times=1)
    if more_drop:
        all_drop_info = steps_res['all_drop_info']
        for thing_type, things_id_num in more_drop.items():
            if thing_type == 'gold':
                steps_res['dungeon_gold'] = steps_res[
                    'dungeon_gold'] + more_drop['gold']['num']
                continue
            all_drop_info.setdefault(thing_type, {})
            for thing_id, num in things_id_num.items():
                if thing_type == 'soul':
                    if 'card' in thing_id:
                        soul_type = 'card'
                    elif 'equip' in thing_id:
                        soul_type = 'equip'
                    all_drop_info[thing_type].setdefault(soul_type, {})
                    all_drop_info[thing_type][soul_type][
                        thing_id] = all_drop_info[thing_type][soul_type].get(
                            thing_id, 0) + num
                else:
                    all_drop_info[
                        thing_type][thing_id] = all_drop_info[thing_type].get(
                            thing_id, 0) + num
    ###################

    #格式化返回的数据
    data['all_drop_info'] = steps_res['all_drop_info']
    data['steps_info'] = steps_res['steps_info']
    data['dungeon_uid'] = last_info['dungeon_uid']
    data['exp_point'] = steps_res['exp_point']
    data['boss_id'] = conf['boss'][0]
    #将本次计算的信息作为历史信息保存
    last_info['floor_id'] = floor_id
    last_info['room_id'] = room_id
    last_info['dungeon_type'] = dungeon_type
    last_info['all_drop_info'] = steps_res['all_drop_info']
    #######################################################################################
    last_info['total_gold'] = steps_res['total_gold']
    last_info['dungeon_gold'] = steps_res['dungeon_gold']
    last_info['exp_point'] = steps_res['exp_point']
    #######################################################################################
    last_info["dungeon_data"] = data
    now = datetime.datetime.now()
    today_str = now.strftime('%Y-%m-%d')
    last_info["limit_time"] = today_str
    last_info['exp'] = steps_res['exp']

    user_dungeon_obj.dungeon_info['last'] = last_info
    user_dungeon_obj.put()
    #将结果返回给前端
    return data