%%---------------------------------------------------- %% 剧情 %% @author liwl %%---------------------------------------------------- -module(drama_data). -export([ cfg/0 , trigger/2 ]). -include("common.hrl"). -include("data_config.hrl"). cfg() -> #data_cfg{ name = drama_data ,lua_name = drama_data ,record = drama_data ,desc = "剧情数据" ,inc = ["common.hrl", "drama.hrl", "condition.hrl"] ,source = "drama_data.xml" ,target = "drama_data.erl" ,callback = [ {{get_const, undefined}, cb_fun, handle, {get_fun, ["常量"], "get_const(~ts) -> ~ts; %% ~ts", [key, val, desc]}} ,{list, cb_fun, handle, {list, ["剧情"]}} ,{get, cb_fun, handle, {get_record, ["剧情"], bid, all}} ,{open_list, cb_fun, handle, {val_tuple_type, ["剧情"], 1, is_open, bid}} ,{tri_guide_cond, cb_fun, handle, {get_tuple, ["引导"], id, tri_conds}} ,{get_guide, cb_fun, handle, {get_tuple, ["引导"], id, conds}} ] ,callback_cli = [ {const, cb_fun_lua, handle, {key_val, ["常量"], [key], all}} , {get, cb_fun_lua, handle, {key_val, ["剧情"], bid, all}} , {guide, cb_fun_lua, handle, {key_val, ["引导"], id, all}} , {lev_guide, cb_fun_lua, handle, {key_val, ["等级引导"], lev, all}} ] ,callback_json = [ {const, cb_fun_json, handle, {key_val, ["常量"], [key], all}} , {get, cb_fun_json, handle, {key_val, ["剧情"], bid, all}} , {guide, cb_fun_json, handle, {key_val, ["引导"], id, all}} , {lev_guide, cb_fun_json, handle, {key_val, ["等级引导"], lev, all}} ] ,sheet = [ {["剧情"], [#f_column{desc = "剧情Id", type = int, name = bid, mod = all} ,#f_column{desc = "名称", type = bstr, name = name, mod = all} ,#f_column{type = int, name = lev, desc = "开放等级"} ,#f_column{desc = "是否开启", type = kv, name = is_open, kv_type = bool} ,#f_column{desc = "是否跳过", type = kv, name = is_skip, kv_type = bool, mod = all} ,#f_column{desc = "是否切屏", type = kv, name = is_switch, kv_type = bool, mod = client} ,#f_column{desc = "上线处理方式", type = kv, name = offline, kv_type = [{"跳过剧情", 1}, {"重新开始", 2}]} ,#f_column{desc = "触发次数", type = int, name = num} ,#f_column{desc = "触发事件", type = atom, name = event} ,#f_column{desc = "动作条件", type = func, name = act_cond, width = 360, type_func = {?MODULE, trigger} , spilt_str = ";", spilt_line = "\n" , fields = [#f_column{type = atom, name = label, desc = "条件标签"} ,#f_column{type = kv, name = op, kv_type = cond_op, desc = "比较运算符"} ,#f_column{type = term, add_list_sign = false, name = val, desc = "条件要求值"} ] } ,#f_column{desc = "动作参数", type = term, name = act, mod = all, width = 360} ,#f_column{desc = "描述", type = bstr, name = desc, mod = client} ] } ,{["引导"], [ #f_column{type = int, name = id, desc = "ID", primary = true, mod = client} ,#f_column{type = kv, name = skip, desc = "是否可以跳过", kv_type = [{"否", 0}, {"是", 1}], mod = client} ,#f_column{type = term, name = tri_conds, desc = "触发条件", comment = "条件满足才触发,不满足直接当完成处理"} ,#f_column{type = term, name = conds, desc = "引导条件", comment = "引导条件,下次登录时,如果不再成立则自动清掉"} ,#f_column{type = bstr, name = desc, desc = "描述", mod = client} ,#f_column{type = int, name = over_step, desc = "客户端结束步数", mod = client} ,#f_column{type = term, name = special_step, desc = "关键引导步数", mod = client} ,#f_column{type = term, name = act, desc = "动作参数", mod = client, width = 360} ,#f_column{type = kv, name = is_close, desc = "是否关闭窗体", kv_type = [{"否", 0}, {"是", 1}], val = 0, mod = client} ]} ,{["等级引导"], [ #f_column{type = int, name = lev, desc = "等级", primary = true, mod = client} ,#f_column{type = int, name = id, desc = "引导id", mod = client} ]} ,{["常量"],[ #f_column{type = term, name = key, desc = "常量标识", add_list_sign = false,mod = all} ,#f_column{type = term, name = val, desc = "常量值", add_list_sign = false,mod= all} ,#f_column{type = bstr, name = desc, desc = "描述", mod = client} ]} ] %% end sheet }. %% @doc 任务要求处理 trigger(F = #f_column{name = N, desc = Desc, min = Min, max = Max, valid_list = ValidList, add_list_sign = AddListSign}, Lines) -> Val = string:join(Lines, "\n"), case catch length(Val) of L when L >= Min andalso L =< Max -> NewVal = case AddListSign of true -> lists:concat(["[", Val, "]"]); _ -> Val end, NVal = case NewVal of [$[ | _] -> NewVal; [${ | _] -> NewVal; _ -> lists:concat(["[", NewVal, "]"]) end, case util:string_to_term(NVal) of {ok, Term} -> case ValidList =:= [] of true -> NewLines = progress_val(Term, F, []), NewF = F#f_column{type = rec, rec = condition}, gen_data_valid:valid(NewF, NewLines); false -> case gen_data_valid:check_term(Term, ValidList) of true -> NewLines = progress_val(Term, F, []), NewF = F#f_column{type = rec, rec = condition}, gen_data_valid:valid(NewF, NewLines); _ -> ?P(error, ">error 第[~w]行的字段[~w:~ts]的值[~ts]无效 要求为:~w ~n", [erlang:get(row_idx), N, Desc, Val, ValidList]), put(error, true), F#f_column{val = "undefined", val_cli = "nil"} end end; _ -> ?P(error, ">error 第[~w]行的字段[~w:~ts]的值~ts无效~n", [erlang:get(row_idx), N, Desc, NVal]), put(error, true), F#f_column{val = "undefined", val_cli = "nil"} end; _ -> ?P(error, ">error 第[~w]行的字段[~w:~ts]的值[~ts]无效~n", [erlang:get(row_idx), N, Desc, Val]), put(error, true), F#f_column{val = "undefined", val_cli = "nil"} end. progress_val([], _F, Lines) -> lists:reverse(Lines); progress_val([H | T], F, Lines) -> NewLines = progress_val(H, F, Lines), progress_val(T, F, NewLines); progress_val({Evt}, _F, Lines) -> Str = ?S("~ts;等于;undefined", [Evt]), [Str | Lines]; progress_val({Evt, Val}, _F, Lines) -> Str = ?S("~ts;等于;~s", [Evt, util:to_string(Val)]), [Str | Lines]; progress_val({Evt, Op, Val}, _F, Lines) -> Str = ?S("~ts;~ts;~w", [Evt, Op, Val]), ?P("===~ts~n", [Str]), [Str | Lines]; progress_val(Unknow, #f_column{name = N, desc = Desc}, Lines) -> ?P(error, ">error 第[~w]行的字段[~w:~ts]的值[Term:~w]无效~n", [erlang:get(row_idx), N, Desc, Unknow]), Lines.