%%%------------------------------------------------------------------- %%% @author Administrator %%% @copyright (C) 2016, %%% @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} ].