单队玩法扩展多队
【阵法扩展】
1.创建新阵法|复用旧阵法:根据功能情况,决定是采用何种方式。具体配置位置:formation_data的[多队阵法]
2.创建新阵法情况如下 (复用旧阵法无此步骤):
策划配置项:构建新的多队id,构建此多队id下的各个阵法,如下例子
服务端处理项:阵法初始化,不同于单阵,阵法初始化要有各个队伍之间宠物、神器等不能重复的限制
处理情况分类:
一队初始化:与单队逻辑类似
其他队伍初始化,走多队初始化逻辑
3.根据需要,决定是否使用新的战斗类型、防御阵类型
如:荣耀天梯有6人阵、8人阵、多队总共3种战斗类型;防御阵也区分了多队和单队。这部分根据服务端、客户端功能需要采取不同方式
新增时,参照已有战斗类型增加逻辑即可,如下根据其他的战斗类型,参照补齐:
【战斗/结算】
1.战斗
1)进入战斗时,带上多队相关参数
2)防御阵查看 => 有机器人数据和玩家数据两种方式,具体如下(来源为:sky_ladder:get_multi_def_formation)
1 %% @doc 获取对手阵法信息 2 get_multi_def_formation(Role = #role{m_sky_ladder = #m_sky_ladder{rank_list = RankList}}, Index, WaveNo) -> 3 4 Rank = list_util:keyfind(Index, RankList, 1), 5 %% 获取战斗类型 6 CombatType = get_combat_type(), 7 case sky_ladder_mgr:rank_info(Rank) of 8 {ok, #sky_ladder_rank{robot_id = RobotId, lev = MonLev, ext = Ext}} when RobotId > 0 -> 9 case mon_data:get_mon(RobotId) of 10 UnitData = #unit_data{bid = MonBid} -> 11 12 %% 获取多队Id 13 WaveNum = length(mon_data:get_wave_data(MonBid)), 14 MultiId = get_multi_id(WaveNum), 15 16 %% 找到对应的阵法类型 17 FinType = 18 case formation_data:multi_f_type({MultiId, WaveNo}) of 19 FType when is_integer(FType) -> 20 ?MZX_DEBUG("{MultiId, Index}:~w", [{MultiId, WaveNo}]), 21 FType; 22 _ -> 23 %% 多队阵法 24 ?ERR("【荣耀天梯》多队找不到具体的阵法信息 :~w ~w", [{MultiId, WaveNo}, util:get_stacktrace()]), 25 201 26 end, 27 28 %% 获取修正属性参数 29 FixId = list_util:keyfind(?sky_ladder_rank_ext_fix_id, Ext, 0), 30 FixArgs = get_fix_attr_args(FixId), 31 32 %% 构造fighter 33 Fighter = 34 case unit_lib:combat_info(MonBid, #unit{lev = MonLev}, [{wave, WaveNo - 1}] ++ FixArgs) of 35 {ok, CFighterList, _} -> 36 CFighterList; 37 _ -> 38 [] 39 end, 40 41 %% 计算战力 42 Power = lists:sum([attr:calc_power(Attr) || #fighter{attr = Attr} <- Fighter]), 43 44 WorldLev = world_lev:get_world_lev(), 45 PetList = formation:pack_fight_mon(Fighter, [], Role, WorldLev), 46 47 MonSkillList = formation:get_mon_shenqi_skill(MonBid, WaveNo), 48 case mon_data:get_mon(MonBid) of 49 UnitData = #unit_data{} -> 50 CustomInfo = #def_formation_info{combat_type = ?combat_type_sky_ladder_multi, type = FinType, all_power = Power, skill_list = MonSkillList, pet_pos_info = PetList}, 51 formation:pack_def_formation(Role, #{mon_id => MonBid, unit_data => UnitData, index => WaveNo}, CustomInfo); 52 _ -> 53 {false, ?T("找不到阵法数据")} 54 end; 55 _ -> 56 {false, ?T("找不到阵法数据")} 57 end; 58 {ok, RankInfo = #sky_ladder_rank{wave_list = _}} -> 59 %% 获取玩家信息 60 case get_role_image(RankInfo) of 61 {ok, Image = #role{}} -> 62 %% 获取使用的防御阵法 63 FType = 64 case sky_ladder_mgr:get_multi_id() of 65 0 -> 66 %% 单人玩法 67 formation_lib:get_def_flag(Image, CombatType); 68 MultiId -> 69 %% 多队玩法 70 DefMultiId = formation_lib:get_def_multi_id(Role, CombatType, MultiId), 71 FlagList = formation_lib:get_multi_flag_list(DefMultiId), 72 list_util:keyfind(WaveNo, FlagList, 0) 73 end, 74 75 CombatMapId = 0, 76 FLev = 1, 77 FightList = combat_util:fighter_group(Image, FType), 78 %% 神器gm 79 {ASkillList, PSkillList} = role_shenqi:get_skill(Image#role{extra = [{?role_extra_formation_type, FType}]}), 80 ShenqiList = role_shenqi:get_shenqi_equip_info(Image, FType), 81 {_, AllSpeed, PetList, RList} = loop_pack_def_formation(FightList, 0, 0, [], []), 82 %% AllPower = attr:get_total_power(Image), 83 AllPower = formation:calc_f_type_power(Image, FType), 84 CustomInfo = #def_formation_info{combat_type = CombatType, combat_map_id = CombatMapId, type = FType, f_lev = FLev, all_power = AllPower, speed = AllSpeed, skill_list = ASkillList ++ PSkillList, shenqi_list = ShenqiList, pet_pos_info = PetList, role_pos_info = RList}, 85 formation:pack_def_formation(Role, #{role => Image}, CustomInfo); 86 _ -> 87 {false, ?T("获取数据繁忙中,请稍后挑战")} 88 end; 89 _ -> 90 {false, ?T("找不到目标阵法3")} 91 end.
2.结算
多队玩法的胜利条件各有不同,根据策划需求编写胜利逻辑(可能赢多的胜、可能全赢才算胜)
多队结算界面展示 ,无需处理,原逻辑通用
数据来源:dungeon:get_cache_hurt_statistics(CombatType)
传输方式为:{array, total_statistics, statistics, "统计", proto_121:get_statistics()}
【机器人数据构造】
基本的机器人数据都是配置项,找相关策划补充配置即可
需要处理的可能是机器人的战力展示、神器技能带入
【录像】
逻辑通用,扩展多队时不需要额外增加逻辑
相关协议为:
播放录像:20028
播放某一队录像:20029
查看录像详细数据(客户端界面展示具体信息用):20056