265 lines
19 KiB
Erlang
265 lines
19 KiB
Erlang
|
|
%%----------------------------------------------------
|
||
|
|
%% 任务模块
|
||
|
|
%% @author liwl
|
||
|
|
%%----------------------------------------------------
|
||
|
|
-module(quest_data).
|
||
|
|
-export([cfg/0, get/1, progress/2]).
|
||
|
|
-include("common.hrl").
|
||
|
|
-include("data_config.hrl").
|
||
|
|
|
||
|
|
cfg() ->
|
||
|
|
#data_cfg{
|
||
|
|
name = quest_data
|
||
|
|
, lua_name = quest_data
|
||
|
|
, desc = "任务数据"
|
||
|
|
, record = quest_data
|
||
|
|
, inc = ["common.hrl", "quest.hrl", "gain.hrl"]
|
||
|
|
, splitv = 2
|
||
|
|
, source = "quest_data.xml"
|
||
|
|
, target = "quest_data.erl"
|
||
|
|
, callback = [
|
||
|
|
{list, cb_fun, handle, {list, ["主支任务", "其它任务", "日常任务"]}}
|
||
|
|
, {type_list, cb_fun, handle, {tuple_type, ["主支任务", "其它任务", "日常任务"], type, id}}
|
||
|
|
, {lev_list, cb_fun, handle, {tuple_type, ["主支任务", "其它任务", "日常任务"], lev, id}}
|
||
|
|
, {lev_classes_list, cb_fun, handle, {tuple_type, ["主支任务", "其它任务", "日常任务"], [lev, career], id}}
|
||
|
|
, {get, cb_fun, handle, {get_record, ["主支任务", "其它任务", "日常任务"], id, all}}
|
||
|
|
, {group, cb_fun, handle, {tuple_type, ["主支任务", "其它任务", "日常任务"], group, id}}
|
||
|
|
%% , {get_phase, cb_fun, handle, {tuple_type, ["主支任务"], phase, id}}
|
||
|
|
%% , {phase_list, cb_fun, handle, {tuple_list, ["主支任务"], phase, false}}
|
||
|
|
, {{type_name,"<<>>"}, cb_fun, handle, {kv, quest_type}}
|
||
|
|
, {dungeon_quest, cb_fun, handle, {tuple_type, ["日常任务"], dungeon_id, id}}
|
||
|
|
]
|
||
|
|
,callback_cli = [
|
||
|
|
{get, cb_fun_lua, handle, {key_val, ["主支任务", "其它任务", "日常任务"], id, [id, name, lev, type, desc, progress, extra, commit_rewards, res]}}
|
||
|
|
, {progress_lable, cb_fun_lua, handle, {format, ["任务要求事件说明"], " ~ts = \"~ts\", --~ts", [label, label, desc]}}
|
||
|
|
]
|
||
|
|
,callback_json = [
|
||
|
|
{get, cb_fun_json, handle, {key_val, ["主支任务", "其它任务", "日常任务"], id, [id, name, lev, type,group, group_desc, desc, progress, extra, commit_rewards, res, skip_id]}}
|
||
|
|
, {progress_lable, cb_fun_json, handle, {format, ["任务要求事件说明"], "\"~ts\":\"~ts\"", [label, label]}}
|
||
|
|
]
|
||
|
|
, sheet = [
|
||
|
|
{["主支任务", "其它任务"],
|
||
|
|
[#f_column{desc = "任务ID", type = int, primary = true, name = id, mod = all}
|
||
|
|
, #f_column{desc = "任务名称", type = bstr, name = name, mod = all}
|
||
|
|
, #f_column{desc = "职业需求", type = kv, name = career, kv_type = career}
|
||
|
|
, #f_column{desc = "任务等级", type = int, name = lev, min = 1, max = 150, mod = all}
|
||
|
|
, #f_column{desc = "任务类型", type = kv, name = type, kv_type = quest_type, mod = all}
|
||
|
|
, #f_column{desc = "组别", type = int, name = group, val = 0, mod = all}
|
||
|
|
, #f_column{desc = "组别描述", type = str, name = group_desc, val = "", mod = client}
|
||
|
|
, #f_column{desc = "任务层级", type = kv, name = layer, kv_type = {?MODULE, get, [layer]}, val = 0, mod = all}
|
||
|
|
, #f_column{desc = "任务阶段", type = int, comment = "用于区分任务的先后顺序", name = phase}
|
||
|
|
, #f_column{desc = "是否发放阶段任务奖励", type = kv, name = is_auto_finished_gain, kv_type = bool}
|
||
|
|
, #f_column{desc = "任务描述", type = bstr, name = desc, width = 360, mod = client}
|
||
|
|
, #f_column{desc = "前置任务", type = term, name = pre_quest, valid_list = [undefined, all, integer],
|
||
|
|
add_list_sign = false, comment = "[10001, 10002]表示需完成其中一个前置任务 \n[0, 10001, 10002]表示需要完成所有的制定任务"
|
||
|
|
}
|
||
|
|
, #f_column{desc = "继承前置任务值", type = kv, name = val_from_prev, kv_type = bool}
|
||
|
|
, #f_column{desc = "自动领取", type = kv, name = auto_accept, kv_type = bool, mod = all}
|
||
|
|
, #f_column{desc = "提交任务方式", type = kv, kv_type = {?MODULE, get, [commit_type]}, name = commit_type, mod = all}
|
||
|
|
, #f_column{desc = "是否隐藏", type = kv, name = hide, kv_type = bool, mod = client}
|
||
|
|
, #f_column{desc = "接受条件限制", type = rec, name = condition, rec = condition,
|
||
|
|
width = 360, spilt_str = ";",
|
||
|
|
fields = [
|
||
|
|
#f_column{desc = "条件标签", type = kv, name = label, kv_type = cond_label}
|
||
|
|
, #f_column{desc = "比较运算符", type = kv, name = op, kv_type = cond_op}
|
||
|
|
, #f_column{desc = "条件要求值", type = term, name = val, add_list_sign = false}
|
||
|
|
, #f_column{desc = "判定失败时的提示信息", type = bstr, name = msg}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
, #f_column{desc = "任务要求", type = func, name = progress, width = 360, spilt_str = ";", type_func = {?MODULE, progress},
|
||
|
|
fields = [
|
||
|
|
#f_column{desc = "服务端事件", type = term, name = label, add_list_sign = false}
|
||
|
|
, #f_column{desc = "客户端标签", type = str, name = cli_label, mod = client}
|
||
|
|
, #f_column{desc = "目标值", type = int, name = target, mod = all}
|
||
|
|
, #f_column{desc = "目标需求值", type = int, name = target_val, mod = all}
|
||
|
|
, #f_column{desc = "服务端附加参数", type = term, name = param, add_list_sign = false}
|
||
|
|
, #f_column{desc = "客户端附加参数", type = term, name = param, add_list_sign = false, mod = client}
|
||
|
|
],
|
||
|
|
valid_list = [
|
||
|
|
{atom, integer, integer},
|
||
|
|
{atom, integer, integer, term},
|
||
|
|
{atom, atom, integer, integer, term}
|
||
|
|
],
|
||
|
|
comment = "{事件标签, 目标值, 目标需求值, 附加参数} 或 {服务端事件标签, 服务端事件标签, 目标值, 目标需求值, 附加参数}\n"
|
||
|
|
"事件标签/服务端事件标签/客户端事件标签:英文字符串;\n"
|
||
|
|
"目标值:整数\n"
|
||
|
|
"目标需求值:整数\n"
|
||
|
|
"附加参数需要用“[]”包括,其中每一项需要用“{}”包括:[{monitor}, {type, 1}]\n"
|
||
|
|
"多个任务目标用“;”(分号)分隔,例如: {evt_get_item, 10001, 1, [{monitor}]};{evt_use_item, 10001, 1, [{type, 1}]}",
|
||
|
|
mod = all
|
||
|
|
}
|
||
|
|
, #f_column{desc = "任务扩展参数", type = term, name = extra, add_list_sign = false, comment = "每一项需要用“{}”包括:[{type, 1}, {id, 1}]", def_cli_val = "{}", mod = all}
|
||
|
|
, #f_column{desc = "任务奖励", type = term, name = commit_rewards, comment = "奖励格式:{物品基础Id, 数量}, {物品基础Id, 数量}", width = 360, mod = all}
|
||
|
|
, #f_column{desc = "展示图标", type = bstr, name = res, width = 360, mod = client}
|
||
|
|
, #f_column{desc = "章节描述", type = bstr, name = chapter_desc, width = 360, mod = client}
|
||
|
|
, #f_column{desc = "跳转", type = int, name = skip_id, mod = client}
|
||
|
|
]}
|
||
|
|
,{["日常任务"],
|
||
|
|
[#f_column{desc = "任务ID", type = int, primary = true, name = id, mod = all}
|
||
|
|
, #f_column{desc = "任务名称", type = bstr, name = name, mod = all}
|
||
|
|
, #f_column{desc = "职业需求", type = kv, name = career, kv_type = career}
|
||
|
|
, #f_column{desc = "任务等级", type = int, name = lev, min = 1, max = 150, mod = all}
|
||
|
|
, #f_column{desc = "任务类型", type = kv, name = type, kv_type = quest_type, mod = all}
|
||
|
|
, #f_column{desc = "组别", type = int, name = group, val = 0, mod = all}
|
||
|
|
, #f_column{desc = "组别描述", type = str, name = group_desc, val = "", mod = client}
|
||
|
|
, #f_column{desc = "任务层级", type = kv, name = layer, kv_type = {?MODULE, get, [layer]}, val = 0, mod = all}
|
||
|
|
, #f_column{desc = "任务阶段", type = int, comment = "用于区分任务的先后顺序", name = phase}
|
||
|
|
, #f_column{desc = "是否发放阶段任务奖励", type = kv, name = is_auto_finished_gain, kv_type = bool}
|
||
|
|
, #f_column{desc = "任务描述", type = bstr, name = desc, width = 360, mod = client}
|
||
|
|
, #f_column{desc = "前置任务", type = term, name = pre_quest, valid_list = [undefined, all, integer],
|
||
|
|
add_list_sign = false, comment = "[10001, 10002]表示需完成其中一个前置任务 \n[0, 10001, 10002]表示需要完成所有的制定任务"
|
||
|
|
}
|
||
|
|
, #f_column{desc = "继承前置任务值", type = kv, name = val_from_prev, kv_type = bool}
|
||
|
|
, #f_column{desc = "自动领取", type = kv, name = auto_accept, kv_type = bool, mod = all}
|
||
|
|
, #f_column{desc = "提交任务方式", type = kv, kv_type = {?MODULE, get, [commit_type]}, name = commit_type, mod = all}
|
||
|
|
, #f_column{desc = "是否隐藏", type = kv, name = hide, kv_type = bool, mod = client}
|
||
|
|
, #f_column{desc = "关卡限制", type = int, name = dungeon_id}
|
||
|
|
, #f_column{desc = "接受条件限制", type = rec, name = condition, rec = condition,
|
||
|
|
width = 360, spilt_str = ";",
|
||
|
|
fields = [
|
||
|
|
#f_column{desc = "条件标签", type = kv, name = label, kv_type = cond_label}
|
||
|
|
, #f_column{desc = "比较运算符", type = kv, name = op, kv_type = cond_op}
|
||
|
|
, #f_column{desc = "条件要求值", type = term, name = val, add_list_sign = false}
|
||
|
|
, #f_column{desc = "判定失败时的提示信息", type = bstr, name = msg}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
, #f_column{desc = "任务要求", type = func, name = progress, width = 360, spilt_str = ";", type_func = {?MODULE, progress},
|
||
|
|
fields = [
|
||
|
|
#f_column{desc = "服务端事件", type = term, name = label, add_list_sign = false}
|
||
|
|
, #f_column{desc = "客户端标签", type = str, name = cli_label, mod = client}
|
||
|
|
, #f_column{desc = "目标值", type = int, name = target, mod = all}
|
||
|
|
, #f_column{desc = "目标需求值", type = int, name = target_val, mod = all}
|
||
|
|
, #f_column{desc = "服务端附加参数", type = term, name = param, add_list_sign = false}
|
||
|
|
, #f_column{desc = "客户端附加参数", type = term, name = param, add_list_sign = false, mod = client}
|
||
|
|
],
|
||
|
|
valid_list = [
|
||
|
|
{atom, integer, integer},
|
||
|
|
{atom, integer, integer, term},
|
||
|
|
{atom, atom, integer, integer, term}
|
||
|
|
],
|
||
|
|
comment = "{事件标签, 目标值, 目标需求值, 附加参数} 或 {服务端事件标签, 服务端事件标签, 目标值, 目标需求值, 附加参数}\n"
|
||
|
|
"事件标签/服务端事件标签/客户端事件标签:英文字符串;\n"
|
||
|
|
"目标值:整数\n"
|
||
|
|
"目标需求值:整数\n"
|
||
|
|
"附加参数需要用“[]”包括,其中每一项需要用“{}”包括:[{monitor}, {type, 1}]\n"
|
||
|
|
"多个任务目标用“;”(分号)分隔,例如: {evt_get_item, 10001, 1, [{monitor}]};{evt_use_item, 10001, 1, [{type, 1}]}",
|
||
|
|
mod = all
|
||
|
|
}
|
||
|
|
, #f_column{desc = "任务扩展参数", type = term, name = extra, add_list_sign = false, comment = "每一项需要用“{}”包括:[{type, 1}, {id, 1}]", def_cli_val = "{}", mod = all}
|
||
|
|
, #f_column{desc = "任务奖励", type = term, name = commit_rewards, comment = "奖励格式:{物品基础Id, 数量}, {物品基础Id, 数量}", width = 360, mod = all}
|
||
|
|
, #f_column{desc = "展示图标", type = bstr, name = res, width = 360, mod = client}
|
||
|
|
, #f_column{desc = "章节描述", type = bstr, name = chapter_desc, width = 360, mod = client}
|
||
|
|
, #f_column{desc = "跳转", type = int, name = skip_id, mod = client}
|
||
|
|
]}
|
||
|
|
, {["任务要求事件说明"],
|
||
|
|
[#f_column{desc = "事件标签", type = bstr, name = label, comment = "以\"evt_\"开头,例如:evt_get_item表示获得物品事件", width = 200, mod = client}
|
||
|
|
, #f_column{desc = "描述说明", type = bstr, name = desc, mod = client, width = 250}
|
||
|
|
, #f_column{desc = "目标", type = bstr, name = target, mod = desc, comment = "Target", width = 100}
|
||
|
|
, #f_column{desc = "目标值", type = bstr, name = target_val, mod = desc, comment = "TargetVal", width = 100}
|
||
|
|
, #f_column{desc = "扩展参数说明", type = bstr, name = ext_desc, mod = desc, width = 360}
|
||
|
|
, #f_column{desc = "示例", type = bstr, name = example, mod = desc, width = 360}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
, {["任务要求附加参数说明"],
|
||
|
|
[#f_column{desc = "参数标签", type = atom, name = label}
|
||
|
|
, #f_column{desc = "描述说明", type = bstr, name = desc, comment = ""}
|
||
|
|
, #f_column{desc = "位置2", type = bstr, name = arg2, comment = "对该位置的文字描述", mod = desc}
|
||
|
|
, #f_column{desc = "位置3", type = bstr, name = arg3, comment = "对该位置的文字描述", mod = desc}
|
||
|
|
, #f_column{desc = "位置4", type = bstr, name = arg4, comment = "对该位置的文字描述", mod = desc}
|
||
|
|
, #f_column{desc = "位置5", type = bstr, name = arg5, comment = "对该位置的文字描述", mod = desc}
|
||
|
|
, #f_column{desc = "位置6", type = bstr, name = arg6, comment = "对该位置的文字描述", mod = desc}
|
||
|
|
, #f_column{desc = "位置7", type = bstr, name = arg7, comment = "对该位置的文字描述", mod = desc}
|
||
|
|
, #f_column{desc = "位置8", type = bstr, name = arg8, comment = "对该位置的文字描述", mod = desc}
|
||
|
|
, #f_column{desc = "位置9", type = bstr, name = arg9, comment = "对该位置的文字描述", mod = desc}
|
||
|
|
, #f_column{desc = "位置10", type = bstr, name = arg10, comment = "对该位置的文字描述", mod = desc}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}.
|
||
|
|
|
||
|
|
%% kv
|
||
|
|
get(commit_type) ->
|
||
|
|
[{"手动提交", 1}
|
||
|
|
, {"自动提交", 2}
|
||
|
|
];
|
||
|
|
get(layer) ->
|
||
|
|
[{"主线一级", 1}
|
||
|
|
, {"主线二级", 2}
|
||
|
|
];
|
||
|
|
get(_) ->
|
||
|
|
[].
|
||
|
|
|
||
|
|
%% @doc 任务要求处理
|
||
|
|
progress(F = #f_column{name = N, desc = Desc, min = Min, max = Max, valid_list = ValidList, fields = Fields}, Lines) ->
|
||
|
|
Val = string:join(Lines, "\n"),
|
||
|
|
case catch length(Val) of
|
||
|
|
L when L >= Min andalso L =< Max ->
|
||
|
|
NVal = case Val of [$[ | _] -> Val; [${ | _] -> Val; _ -> lists:concat(["[", Val, "]"]) 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 = quest_progress, name = N, fields = Fields},
|
||
|
|
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 = quest_progress, name = N, fields = Fields},
|
||
|
|
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, Val]),
|
||
|
|
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, Target, TargetVal}, F, Lines) ->
|
||
|
|
progress_val({Evt, Evt, Target, TargetVal, []}, F, Lines);
|
||
|
|
progress_val({Evt, Target, TargetVal, Param}, F, Lines) ->
|
||
|
|
progress_val({Evt, Evt, Target, TargetVal, Param}, F, Lines);
|
||
|
|
progress_val({SrvEvt, CliEvt, Target, TargetVal, Param}, _F, Lines) ->
|
||
|
|
%% {SrvParam, CliParam} = split_param(Param, [], []),
|
||
|
|
Str = util:term_to_string(Param),
|
||
|
|
Line = ?S("~w; ~w; ~w; ~w; ~ts; ~ts", [SrvEvt, CliEvt, Target, TargetVal, Str, Str]),
|
||
|
|
[Line | 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.
|
||
|
|
|
||
|
|
%% @doc 拆分服务端/客户端任务要求附加参数
|
||
|
|
%% split_param([], Srv, Cli) ->
|
||
|
|
%% {Srv, Cli};
|
||
|
|
%% split_param([H | T], Srv, Cli) ->
|
||
|
|
%% {NewSrv, NewCli} = split_param(H, Srv, Cli),
|
||
|
|
%% split_param(T, NewSrv, NewCli);
|
||
|
|
%% split_param(H, Srv, Cli) when is_tuple(H) ->
|
||
|
|
%% Label = element(1, H),
|
||
|
|
%% NewSrv = case lists:member(Label, ?MODULE:get(progress_srv_param)) of
|
||
|
|
%% true -> [H | Srv];
|
||
|
|
%% false -> Srv
|
||
|
|
%% end,
|
||
|
|
%% NewCli = case lists:member(Label, ?MODULE:get(progress_cli_param)) of
|
||
|
|
%% true -> [H | Cli];
|
||
|
|
%% false -> Cli
|
||
|
|
%% end,
|
||
|
|
%% {NewSrv, NewCli};
|
||
|
|
%% split_param(_Unknow, Srv, Cli) ->
|
||
|
|
%% {Srv, Cli}.
|