Files
fc/server/tools/gen_data/cfg/drama_data.erl
T

142 lines
8.0 KiB
Erlang
Raw Normal View History

2026-05-23 22:10:14 +08:00
%%----------------------------------------------------
%% 剧情
%% @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.