400 lines
18 KiB
Erlang
400 lines
18 KiB
Erlang
|
|
%%%-------------------------------------------------------------------
|
||
|
|
%%% @author Administrator
|
||
|
|
%%% @copyright (C) 2016, <COMPANY>
|
||
|
|
%%% @doc
|
||
|
|
%%%
|
||
|
|
%%% @end
|
||
|
|
%%% Created : 22. 十二月 2016 8:48
|
||
|
|
%%%-------------------------------------------------------------------
|
||
|
|
-module(skill_other_part_data).
|
||
|
|
-export([cfg/0]).
|
||
|
|
|
||
|
|
-export([skill_type/0, target_type/0, effect_type/0, hit_type/0, trigger_condition/0, join_type/0, buff_result_type/0
|
||
|
|
,positive_or_negative_type/0, effect_condition/0, passive_effect_condition/0, skill_target/0, hurt_type/0, skill_best_target/0, fit_combat_type/0
|
||
|
|
]).
|
||
|
|
-include("data_config.hrl").
|
||
|
|
-include("common.hrl").
|
||
|
|
cfg() ->
|
||
|
|
#data_cfg{
|
||
|
|
name = skill_data
|
||
|
|
,lua_name = skill_data
|
||
|
|
,desc = "skill配置数据"
|
||
|
|
,source = "skill_other_part_data.xml"
|
||
|
|
,target = "skill_data.erl"
|
||
|
|
,inc = ["skill.hrl", "common.hrl"]
|
||
|
|
,callback = [
|
||
|
|
{{check_skill_data, 0 , ""}, cb_fun, handle, {get_all_fun, "
|
||
|
|
check_skill_data() ->
|
||
|
|
check_skill_id_repeat(list_ids(), #{}),
|
||
|
|
[check_skill_data_id(Id) || Id <- list_ids()].
|
||
|
|
"}}
|
||
|
|
,{check_skill_data_id, cb_fun, handle, {get_all_fun, "
|
||
|
|
check_skill_data_id(Id) ->
|
||
|
|
case is_check_data({skill, Id}) of
|
||
|
|
true ->
|
||
|
|
case skill_data:get_skill(Id) of
|
||
|
|
#skill_data{effect_list = EffList, type = Type} ->
|
||
|
|
[check_skill_data_eff(EId, Id, Type) || EId <- EffList];
|
||
|
|
_ -> pass
|
||
|
|
end;
|
||
|
|
_ -> pass
|
||
|
|
end.
|
||
|
|
check_skill_id_repeat([], IdMap) ->
|
||
|
|
IdMap;
|
||
|
|
check_skill_id_repeat([Id | T], IdMap) ->
|
||
|
|
case maps:get(Id, IdMap, 0) of
|
||
|
|
0 -> check_skill_id_repeat(T, maps:put(Id, 1, IdMap));
|
||
|
|
_ ->
|
||
|
|
?DATA_ERR(\"Skill ID is repeated:~w\", [Id]),
|
||
|
|
check_skill_id_repeat(T, IdMap)
|
||
|
|
end.
|
||
|
|
check_skill_data_eff(Id, SkillId, SkillType) ->
|
||
|
|
case is_check_data({skill_eff, Id}) of
|
||
|
|
true ->
|
||
|
|
case skill_data:get_effect(Id) of
|
||
|
|
%% #effect_data{effect_type = hurt} when SkillType =:= passive_skill ->
|
||
|
|
%% ?DATA_ERR(\"Passive skills====~w effect type ishurt\", [SkillId, Id]);
|
||
|
|
#effect_data{passive_effect = Passive, effect_type = hurt} when Passive =/= none ->
|
||
|
|
?DATA_ERR(\"Passive skills====~w effect type ishurt\", [Id]);
|
||
|
|
_ -> skip
|
||
|
|
end,
|
||
|
|
case skill_data:get_effect(Id) of
|
||
|
|
#effect_data{effect_param = Params = [_ | _]} ->
|
||
|
|
case lists:keyfind(buff, 1, Params) of
|
||
|
|
{buff, Buffs = [_ | _]} ->
|
||
|
|
[check_buff_data(BuffId) || BuffId <- Buffs];
|
||
|
|
{buff, BuffId} ->
|
||
|
|
check_buff_data(BuffId);
|
||
|
|
_ -> pass
|
||
|
|
end,
|
||
|
|
case lists:keyfind(self_buff, 1, Params) of
|
||
|
|
{self_buff, Buffs1 = [_ | _]} ->
|
||
|
|
[check_buff_data(BuffId) || BuffId <- Buffs1];
|
||
|
|
{self_buff, BuffId1} ->
|
||
|
|
check_buff_data(BuffId1);
|
||
|
|
_ -> pass
|
||
|
|
end,
|
||
|
|
case lists:keyfind(target_to_self_buff, 1, Params) of
|
||
|
|
{target_to_self_buff, Buffs2 = [_ | _]} ->
|
||
|
|
[check_buff_data(BuffId2) || BuffId2 <- Buffs2];
|
||
|
|
{target_to_self_buff, BuffId2} ->
|
||
|
|
check_buff_data(BuffId2);
|
||
|
|
_ -> pass
|
||
|
|
end;
|
||
|
|
_ -> pass
|
||
|
|
end;
|
||
|
|
_ -> pass
|
||
|
|
end.
|
||
|
|
|
||
|
|
is_check_data(Key) ->
|
||
|
|
Map = get(check_info),
|
||
|
|
put(check_info, maps:put(Key, 1, Map)),
|
||
|
|
maps:get(Key, Map, 0) =:= 0.
|
||
|
|
|
||
|
|
check_buff_data(BuffId) ->
|
||
|
|
case skill_data:get_buff(BuffId) of
|
||
|
|
#combat_buff_data{join_type = use_by_pro} ->
|
||
|
|
skill_data:get_buff_pro(BuffId);
|
||
|
|
_ -> pass
|
||
|
|
end.
|
||
|
|
"}}
|
||
|
|
,{{check_skill_data_normal, 2, ""}, cb_fun, handle, {get_all_fun, "
|
||
|
|
check_skill_data_normal([], From) ->
|
||
|
|
?DATA_ERR(\"[~w]General attack skill is not configured.\", [From]);
|
||
|
|
check_skill_data_normal([SkillId | T], From) ->
|
||
|
|
case skill_data:get_skill(SkillId) of
|
||
|
|
#skill_data{is_normal_skill = ?true} -> true;
|
||
|
|
_ -> check_skill_data_normal(T, From)
|
||
|
|
end.
|
||
|
|
"}}
|
||
|
|
,{{check_skill_data_active, 2, ""}, cb_fun, handle, {get_all_fun, "
|
||
|
|
check_skill_data_active(SkillId, From) ->
|
||
|
|
case is_check_data({skill_active, SkillId}) of
|
||
|
|
true ->
|
||
|
|
case skill_data:get_skill(SkillId) of
|
||
|
|
#skill_data{type = active_skill} -> pass;
|
||
|
|
#skill_data{} ->
|
||
|
|
?DATA_ERR(\"Not active skills:~w ~w\", [SkillId, From]);
|
||
|
|
_ -> pass
|
||
|
|
end;
|
||
|
|
_ -> pass
|
||
|
|
end.
|
||
|
|
"}}
|
||
|
|
,{{check_skill_data_passive, 2, ""}, cb_fun, handle, {get_all_fun, "
|
||
|
|
check_skill_data_passive(SkillId, From) ->
|
||
|
|
case is_check_data({skill_passive, SkillId}) of
|
||
|
|
true ->
|
||
|
|
case skill_data:get_skill(SkillId) of
|
||
|
|
#skill_data{type = passive_skill} -> pass;
|
||
|
|
#skill_data{} ->
|
||
|
|
?DATA_ERR(\"Not a passive skill:~w ~w\", [SkillId, From]);
|
||
|
|
_ -> pass
|
||
|
|
end;
|
||
|
|
_ -> pass
|
||
|
|
end.
|
||
|
|
"}}
|
||
|
|
,{{list_ids, 0, ""}, cb_fun, handle, {get_all_fun, "
|
||
|
|
list_ids() ->
|
||
|
|
lists:concat([
|
||
|
|
skill_part1_data:list_ids()
|
||
|
|
,skill_part2_data:list_ids()
|
||
|
|
,skill_part3_data:list_ids()
|
||
|
|
,skill_part4_data:list_ids()
|
||
|
|
,skill_part5_data:list_ids()
|
||
|
|
,skill_part6_data:list_ids()
|
||
|
|
]).
|
||
|
|
"}}
|
||
|
|
,{get_skill, cb_fun, handle, {get_all_fun, "
|
||
|
|
get_skill(SkillId) ->
|
||
|
|
case skill_part1_data:get_skill(SkillId) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part2_data:get_skill(SkillId) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part3_data:get_skill(SkillId) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part4_data:get_skill(SkillId) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part5_data:get_skill(SkillId) of
|
||
|
|
undefined -> skill_part6_data:get_skill(SkillId);
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end.
|
||
|
|
"}}
|
||
|
|
,{get_effect, cb_fun, handle, {get_all_fun, "
|
||
|
|
get_effect(EffectId) ->
|
||
|
|
case skill_part1_data:get_effect(EffectId) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part2_data:get_effect(EffectId) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part3_data:get_effect(EffectId) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part4_data:get_effect(EffectId) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part5_data:get_effect(EffectId) of
|
||
|
|
undefined -> skill_part6_data:get_effect(EffectId);
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end.
|
||
|
|
"}}
|
||
|
|
,{get_buff, cb_fun, handle, {get_record, ["BUFF"], bid, combat_buff_data, all}}
|
||
|
|
,{get_buff_pro, cb_fun, handle, {get_tuple, ["BUFF"], bid, group_pro}}
|
||
|
|
,{{get_skill_id_by_group, 2, ""}, cb_fun, handle, {get_all_fun,"
|
||
|
|
get_skill_id_by_group(SkillId, Lev) ->
|
||
|
|
case skill_part1_data:get_skill_id_by_group(SkillId, Lev) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part2_data:get_skill_id_by_group(SkillId, Lev) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part3_data:get_skill_id_by_group(SkillId, Lev) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part4_data:get_skill_id_by_group(SkillId, Lev) of
|
||
|
|
undefined ->
|
||
|
|
case skill_part5_data:get_skill_id_by_group(SkillId, Lev) of
|
||
|
|
undefined -> skill_part6_data:get_skill_id_by_group(SkillId, Lev);
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end;
|
||
|
|
Ret -> Ret
|
||
|
|
end.
|
||
|
|
"}}
|
||
|
|
]
|
||
|
|
,callback_cli = [
|
||
|
|
{get_act_data, cb_fun_lua, handle, {key_val, ["动作"], [bid], all}}
|
||
|
|
,{get_effect_data, cb_fun_lua, handle, {key_val, ["特效"], [bid], all}}
|
||
|
|
,{get_buff, cb_fun_lua, handle, {key_val, ["BUFF"], [bid], all}}
|
||
|
|
,{get_shake_data, cb_fun_lua, handle, {key_val, ["震屏"], [bid], all}}
|
||
|
|
,{get_model_data, cb_fun_lua, handle, {key_val, ["特殊模型偏移"], [bid], all}}
|
||
|
|
]
|
||
|
|
,callback_json = [
|
||
|
|
{get_act_data, cb_fun_json, handle, {key_val, ["动作"], [bid], all}}
|
||
|
|
,{get_effect_data, cb_fun_json, handle, {key_val, ["特效"], [bid], all}}
|
||
|
|
,{get_buff, cb_fun_json, handle, {key_val, ["BUFF"], [bid], all}}
|
||
|
|
,{get_shake_data, cb_fun_json, handle, {key_val, ["震屏"], [bid], all}}
|
||
|
|
,{get_model_data, cb_fun_json, handle, {key_val, ["特殊模型偏移"], [bid], all}}
|
||
|
|
]
|
||
|
|
,sheet = [
|
||
|
|
{["BUFF"], [
|
||
|
|
#f_column{type = int, name = bid, desc = "Bid", mod = all, primary = true}
|
||
|
|
,#f_column{type = bstr, name = name, desc = "名称", mod = all}
|
||
|
|
,#f_column{type = int, name = group, desc = "组别", mod = all}
|
||
|
|
,#f_column{type = kv, name = join_type, desc = "叠加类型", kv_type = {?MODULE, join_type, []}, mod = all}
|
||
|
|
,#f_column{type = int, name = lev, desc = "效果等级", mod = server}
|
||
|
|
,#f_column{type = int, name = join_num, desc = "叠加数量", mod = server}
|
||
|
|
,#f_column{type = int, name = duration , desc = "持续时间", mod = all}
|
||
|
|
,#f_column{type = kv, name = buff_result_type, desc = "效果类型", kv_type = {?MODULE, buff_result_type, []}, mod = server}
|
||
|
|
,#f_column{type = kv, name = clean_when_dead, desc = "死亡清除", mod = all, kv_type = [{"是",true},{"否",false}]}
|
||
|
|
,#f_column{type = int, name = clean_next_wave, desc = "持续波数", mod = server}
|
||
|
|
,#f_column{type = int, name = probability, desc = "生效概率", mod = server}
|
||
|
|
,#f_column{type = term, name = buff_result, desc = "参数", mod = server}
|
||
|
|
,#f_column{type = kv, name = positive_or_negative , desc = "增益或减益buff", kv_type = {?MODULE, positive_or_negative_type, []},mod = all}
|
||
|
|
,#f_column{type = kv, name = can_reduce, desc = "能否驱散", kv_type = [{"是", can_reduce}, {"否", can_not_reduce}], mod = server}
|
||
|
|
,#f_column{type = bstr, name = desc, desc = "描述", mod = all}
|
||
|
|
,#f_column{type = int, name = icon, desc = "图标", mod = client}
|
||
|
|
,#f_column{type = int, name = res, desc = "特效", mod = client}
|
||
|
|
,#f_column{type = bstr, name = client_desc, desc = "飘字", mod = client}
|
||
|
|
,#f_column{type = int, name = efftive_effect, desc = "生效特效", mod = client}
|
||
|
|
,#f_column{type = kv, name = can_select, desc = "是否可选技能", val_cli= 1,kv_type = [{"是", 1}, {"否", 0}], mod = client}
|
||
|
|
,#f_column{type = int, name = per , desc = "百分比", mod = client}
|
||
|
|
,#f_column{type = kv, name = is_passive, rec_name = is_show, desc = "buff表现", kv_type = [{"是", true, 1}, {"否", false, 0}], mod = all}
|
||
|
|
,#f_column{type = bstr, name = buff_spine, desc = "变身模型ID", mod = client}
|
||
|
|
,#f_column{type = kv, name = is_release, desc = "是否移除",val_cli= 1,kv_type = [{"是", 1}, {"否", 0}],mod = client}
|
||
|
|
,#f_column{type = int, name = group_pro, desc = "buff组内权重", mod = all}
|
||
|
|
,#f_column{type = int, name = dot_type, desc = "持续伤害类型", comment = "0:非持续伤害 1:中毒 2:流血 3:灼烧", val = "0", mod = server}
|
||
|
|
]}
|
||
|
|
,{["动作"], [
|
||
|
|
#f_column{type = int, name = bid, desc = "Bid", mod = client}
|
||
|
|
,#f_column{type = bstr, name = name, desc = "说明", mod = client}
|
||
|
|
,#f_column{type = int, name = act_type, desc = "动作类型", mod = client}
|
||
|
|
,#f_column{type = term, name = act_args, desc = "动作参数", mod = client}
|
||
|
|
]}
|
||
|
|
,{["特效"], [
|
||
|
|
#f_column{type = int, name = bid, desc = "特效ID", mod = client, primary = true}
|
||
|
|
,#f_column{type = int, min = -9999, name = x_fix, desc = "X轴偏移", mod = client}
|
||
|
|
,#f_column{type = int, min = -9999, name = y_fix, desc = "Y轴偏移", mod = client}
|
||
|
|
,#f_column{type = int, name = scale, desc = "缩放", mod = client}
|
||
|
|
,#f_column{type = int, name = h_scale, desc = "水平翻转", mod = client}
|
||
|
|
,#f_column{type = kv, name = play_type, desc = "播放位置", kv_type = [{"角色", 1}, {"场景", 2}, {"友方", 3}, {"敌方", 4},{"目标", 5}], mod = client}
|
||
|
|
,#f_column{type = bstr, name = res_up, desc = "上层资源", mod = client}
|
||
|
|
,#f_column{type = bstr, name = res_down, desc = "下层资源", mod = client}
|
||
|
|
,#f_column{type = bstr, name = spec_res_up, desc = "友方资源", mod = client}
|
||
|
|
,#f_column{type = bstr, name = up_action_name, desc = "上层动作名称", mod = client}
|
||
|
|
,#f_column{type = bstr, name = down_action_name, desc = "下层层动作名称", mod = client}
|
||
|
|
,#f_column{type = kv, name = is_fornt, desc = "是否后置",val_cli = 0 ,kv_type = [{"否", 0}, {"是", 1}], mod = client}
|
||
|
|
,#f_column{type = kv, name = is_col_effect, desc = "是否列特效",val_cli = 0,kv_type = [{"否", 0}, {"是", 1}],mod = client}
|
||
|
|
]}
|
||
|
|
,{["震屏"], [
|
||
|
|
#f_column{type = int, name = bid, desc = "震屏ID", mod = client, primary = true}
|
||
|
|
,#f_column{type = int, min = 0, name = shake_strength, desc = "幅度", mod = client}
|
||
|
|
,#f_column{type = int, min = 0, name = shake_rate, desc = "震动时间间隔", mod = client}
|
||
|
|
,#f_column{type = int, min = 0, name = shake_time, desc = "震动次数", mod = client}
|
||
|
|
]}
|
||
|
|
,{["特殊模型偏移"], [
|
||
|
|
#f_column{type = bstr, name = bid, desc = "资源ID", mod = client}
|
||
|
|
,#f_column{type = int, min = -999, name = model_height, desc = "模型高度", mod = client}
|
||
|
|
]}
|
||
|
|
|
||
|
|
]
|
||
|
|
}.
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
skill_type() ->
|
||
|
|
[
|
||
|
|
{"主动",active_skill,"active_skill"}
|
||
|
|
,{"被动", passive_skill,"passive_skill"}
|
||
|
|
,{"装备被动", eqm_passive_skill,"eqm_passive_skill"}
|
||
|
|
].
|
||
|
|
|
||
|
|
target_type() ->
|
||
|
|
kv:get(combat_target_type).
|
||
|
|
|
||
|
|
skill_target() ->
|
||
|
|
[
|
||
|
|
{"敌方存活单位", alive_enemy, 1}
|
||
|
|
,{"友方存活单位", alive_ally, 2}
|
||
|
|
,{"友方死亡单位", dead_ally, 3}
|
||
|
|
,{"敌方死亡单位", dead_enemy, 4}
|
||
|
|
,{"自己", self, 5}
|
||
|
|
,{"全场除自己", alive_except_self, 6}
|
||
|
|
,{"友方存活单位除了自己", alive_ally_except_self, 7}
|
||
|
|
|
||
|
|
].
|
||
|
|
|
||
|
|
skill_best_target() ->
|
||
|
|
[
|
||
|
|
{"血量比例最小", min_hp_per}
|
||
|
|
,{"血量比例最大", max_hp_per}
|
||
|
|
,{"速度最低", min_speed}
|
||
|
|
,{"速度最高", max_speed}
|
||
|
|
,{"攻击最低", min_atk}
|
||
|
|
,{"攻击最高", max_atk}
|
||
|
|
,{"物防最低", min_def_p}
|
||
|
|
,{"物防最高", max_def_p}
|
||
|
|
,{"法防最低", min_def_s}
|
||
|
|
,{"法防最高", max_def_s}
|
||
|
|
,{"防御最低", min_def}
|
||
|
|
,{"防御最高", max_def}
|
||
|
|
,{"优先BOSS", boss}
|
||
|
|
,{"攻击条最低", min_distance}
|
||
|
|
,{"攻击条最高", max_distance}
|
||
|
|
,{"破甲", has_reduce_def}
|
||
|
|
,{"优先坦克目标", career_type1}
|
||
|
|
,{"优先物攻目标", career_type2}
|
||
|
|
,{"优先法师目标", career_type3}
|
||
|
|
,{"优先辅助目标", career_type4}
|
||
|
|
].
|
||
|
|
|
||
|
|
effect_type() ->
|
||
|
|
kv:get(effect_type).
|
||
|
|
|
||
|
|
hurt_type() ->
|
||
|
|
[
|
||
|
|
{"物理", physical, 1}
|
||
|
|
,{"法术", spells, 2}
|
||
|
|
].
|
||
|
|
|
||
|
|
|
||
|
|
hit_type() ->
|
||
|
|
[
|
||
|
|
{"固定命中", normal_hit}
|
||
|
|
,{"属性修改", effect_hit}
|
||
|
|
,{"属性修改削弱", attr_hit}
|
||
|
|
].
|
||
|
|
|
||
|
|
trigger_condition() ->
|
||
|
|
kv:get(skill_trigger_condition).
|
||
|
|
|
||
|
|
join_type() ->
|
||
|
|
[
|
||
|
|
{"共存", to_join, 1}
|
||
|
|
,{"替换", to_replace, 2}
|
||
|
|
,{"覆盖共存", use_by_pro, 3}
|
||
|
|
,{"跳过", to_pass, 4}
|
||
|
|
].
|
||
|
|
|
||
|
|
buff_result_type() ->
|
||
|
|
kv:get(buff_result_type).
|
||
|
|
|
||
|
|
positive_or_negative_type() ->
|
||
|
|
[
|
||
|
|
{"增益", positive,1} %% 增益
|
||
|
|
,{"减益", negative,2} %% 减益
|
||
|
|
,{"控制", control,3} %% 控制
|
||
|
|
].
|
||
|
|
|
||
|
|
effect_condition() ->
|
||
|
|
kv:get(effect_condition).
|
||
|
|
|
||
|
|
passive_effect_condition() ->
|
||
|
|
kv:get(passive_effect_condition).
|
||
|
|
|
||
|
|
|
||
|
|
fit_combat_type() ->
|
||
|
|
[
|
||
|
|
{"竞技场", area}
|
||
|
|
,{"试炼塔", trial}
|
||
|
|
,{"剧情副本", chapter}
|
||
|
|
,{"深渊副本", deep}
|
||
|
|
,{"联盟战", guild_war}
|
||
|
|
,{"全体通用", all}
|
||
|
|
].
|