单队玩法扩展多队

【阵法扩展】

  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.
View Code

  2.结算
    多队玩法的胜利条件各有不同,根据策划需求编写胜利逻辑(可能赢多的胜、可能全赢才算胜)
    多队结算界面展示 ,无需处理,原逻辑通用
      数据来源:dungeon:get_cache_hurt_statistics(CombatType)
      传输方式为:{array, total_statistics, statistics, "统计", proto_121:get_statistics()}

【机器人数据构造】
  基本的机器人数据都是配置项,找相关策划补充配置即可
  需要处理的可能是机器人的战力展示、神器技能带入
【录像】
  逻辑通用,扩展多队时不需要额外增加逻辑
  相关协议为:
    播放录像:20028
    播放某一队录像:20029
    查看录像详细数据(客户端界面展示具体信息用):20056

      

      

 

posted @ 2024-07-24 16:48  古比  阅读(30)  评论(0编辑  收藏  举报