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

307 lines
16 KiB
Erlang
Raw Normal View History

2026-05-23 22:10:14 +08:00
%%----------------------------------------------------
%% 数据配置文件
%% @author whjing2011@gmail.com
%%----------------------------------------------------
-module(attr_data).
-export([cfg/0, handle/4]).
-include("data_config.hrl").
-include("common.hrl").
cfg() ->
#data_cfg{
name = attr_data
,lua_name = attr_data
,desc = "attr配置数据"
,source = "attr_data.xml"
,target = "attr_data.erl"
,inc = ["common.hrl", "attr.hrl"]
,callback = [
{{do_sub_list,4, val(do_sub_list)}, ?MODULE, handle, {write_string, function_head(do_sub_list)}}
,{{do_sub,4,val(do_sub)}, cb_fun, handle, {row_fun, ["DATA"], fun row_do_sub/1}}
,{{do_sub1,4,val(do_sub1)}, cb_fun, handle, {row_fun, ["属性批"], fun row_do_sub1/1}}
,{{get_attr_val,2, "get_attr_val(_, _) -> 0."}, cb_fun, handle, {row_fun, ["DATA"], fun do_row/1}}
,{{add_attr_val,3,"add_attr_val(Attr, _, _) -> Attr."}, cb_fun, handle, {row_fun, ["DATA"], fun row_add_attr_val/1}}
,{{attr2per,undefined}, cb_fun, handle, {row_fun, ["DATA"], fun row_attr2per/1}}
,{{attr2atom_kv,1,def}, ?MODULE, handle, {attr2atom_kv, ["DATA"]}}
,{{mix_attr_and_attr,2,def}, ?MODULE, handle, {mix_attr_and_attr, ["DATA"]}}
,{{mix_attr_and_ratio,2,def}, ?MODULE, handle, {mix_attr_and_ratio, ["DATA"]}}
,{{attr_ratio,1,def}, ?MODULE, handle, {attr_ratio, ["DATA"]}}
,{{attr_round,1,def}, ?MODULE, handle, {attr_round, ["DATA"]}}
,{{attr_uround,1,def}, ?MODULE, handle, {attr_uround, ["DATA"]}}
,{{attr_atom2power,0}, cb_fun, handle, {row_fun, ["DATA"], fun row_attr_atom2power/1}}
,{{attr_atom2partner_power,0}, cb_fun, handle, {row_fun, ["DATA"], fun row_attr_atom2partner_power/1}}
,{{attr_atom2id,0}, cb_fun, handle, {row_fun, ["DATA"], fun row_attr_atom2id/1}}
,{{attr_atom2name,"<<>>"}, cb_fun, handle, {row_fun, ["DATA"], fun row_attr_atom2name/1}}
,{{base_power,1,def}, ?MODULE, handle, {base_power, ["DATA"]}}
,{{partner_base_power,1,def}, ?MODULE, handle, {partner_base_power, ["DATA"]}}
,{{print_attr,1,def}, ?MODULE, handle, {print_attr, ["DATA"]}}
,{{atom_to_int, 1, val(atom_to_int)}, cb_fun, handle, {get_tuple, ["DATA"], atom, id}}
,{{int_to_atom, 1, val(int_to_atom)}, cb_fun, handle, {get_tuple, ["DATA"], id, atom}}
,{{attr_addition,2,def}, ?MODULE, handle, {attr_addition, ["DATA"]}}
,{all_attr, cb_fun, handle, {tuple_list, ["DATA"], atom, false}}
]
,callback_cli = [
{id_to_key, cb_fun_lua, handle, {key_val, ["DATA"], id, atom}}
,{key_to_id, cb_fun_lua, handle, {key_val, ["DATA"], atom, id}}
,{id_to_name, cb_fun_lua, handle, {key_val, ["DATA"], id, name}}
,{key_to_name, cb_fun_lua, handle, {key_val, ["DATA"], atom, name}}
,{power, cb_fun_lua, handle, {key_val, ["DATA"], atom, [power, not_to_power]}}
,{type, cb_fun_lua, handle, {key_val, ["DATA"], atom, type}}
,{partner_power, cb_fun_lua, handle, {key_val, ["DATA"], atom, partner_power}}
,{is_show, cb_fun_lua, handle, {key_val, ["DATA"], atom, is_show}, fun("DATA", Row) ->
cb_fun:get_val(is_show, Row) =:= 1;
(_,_) -> false
end}
]
,callback_json = [
{id_to_key, cb_fun_json, handle, {key_val, ["DATA"], id, atom}}
,{key_to_id, cb_fun_json, handle, {key_val, ["DATA"], atom, id}}
,{id_to_name, cb_fun_json, handle, {key_val, ["DATA"], id, name}}
,{key_to_name, cb_fun_json, handle, {key_val, ["DATA"], atom, name}}
,{power, cb_fun_json, handle, {key_val, ["DATA"], atom, power}}
,{type, cb_fun_json, handle, {key_val, ["DATA"], atom, type}}
,{partner_power, cb_fun_json, handle, {key_val, ["DATA"], atom, partner_power}}
,{is_show, cb_fun_json, handle, {key_val, ["DATA"], atom, is_show}, fun("DATA", Row) ->
cb_fun:get_val(is_show, Row) =:= 1;
(_,_) -> false
end}
]
,sheet = [
{["DATA"], [
#f_column{type = int, name = id, desc = "编号", primary = true}
,#f_column{type = bstr, name = name, desc = "名称"}
,#f_column{type = bstr, name = desc, desc = "描述"}
,#f_column{type = atom, name = atom, desc = "原子"}
,#f_column{type = int, name = power, desc = "战力"}
,#f_column{type = int, name = partner_power, desc = "伙伴战力"}
,#f_column{type = int, name = not_to_power, desc = "不计算战力"}
,#f_column{type = kv, name = is_show, desc = "是否显示", kv_type=bool}
,#f_column{type = kv, name = type, desc = "单位", kv_type = [{"数值", 1}, {"百分比", 2}]}
,#f_column{type = kv, name = is_base_power, desc = "是否基础战力", kv_type=bool}
,#f_column{type = kv, name = is_use, desc = "是否可配置属性", kv_type=bool}
]}
,{["属性批"], [
#f_column{type = atom, name = atom, desc = "原始属性", primary = true}
,#f_column{type = kv, name = type, desc = "类型", kv_type = [{"val",1},{"per",2},{"all",3}], primary = true}
,#f_column{type = term, name = attr_list, desc = "属性批"}
]}
]
}.
handle(_DataCfg, SheetDatas, _Label, {attr2atom_kv, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("\t{~-25s, Attr#attr.~-25s}", [Atom, Atom])};
_ -> false
end
end, AllRows),
lists:concat(["attr2atom_kv(Attr) ->[\n", string:join(L, ",\n"), "\n]."]);
handle(_DataCfg, SheetDatas, _Label, {mix_attr_and_attr, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
Flag = lists:member(Atom, ["cure", "be_cure", "res", "res_p", "res_s"]),
case cb_fun:get_val(is_use, Row) of
1 when Flag -> {true, ?S("\t~-25s= util:round(A1#attr.~-25s+ A2#attr.~-25s)", [Atom, Atom, Atom])};
1 -> {true, ?S("\t~-25s= max(0, util:round(A1#attr.~-25s+ A2#attr.~-25s))", [Atom, Atom, Atom])};
_ -> false
end
end, AllRows),
lists:concat(["mix_attr_and_attr(A1, A2) -> #attr{\n", string:join(L, ",\n"), "\n}."]);
handle(_DataCfg, SheetDatas, _Label, {mix_attr_and_ratio, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("\t~-25s= util:round(A1#attr.~-25s* R1#attr.~-25s/1000)", [Atom, Atom, Atom])};
_ -> false
end
end, AllRows),
lists:concat(["mix_attr_and_ratio(A1, R1) -> #attr{\n", string:join(L, ",\n"), "\n}."]);
handle(_DataCfg, SheetDatas, _Label, {attr_ratio, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("\t~-25s= util:round(Attr#attr.~-20s * Ratio / 1000)", [Atom, Atom])};
_ -> false
end
end, AllRows),
lists:concat(["attr_ratio({1000, Attr}) -> Attr;\nattr_ratio({Ratio, Attr}) ->Attr#attr{\n", string:join(L, ",\n"), "\n}."]);
handle(_DataCfg, SheetDatas, _Label, {attr_round, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("\t~-25s= util:round(Attr#attr.~-25s)", [Atom, Atom])};
_ -> false
end
end, AllRows),
lists:concat(["attr_round(Attr) ->Attr#attr{\n", string:join(L, ",\n"), "\n}."]);
handle(_DataCfg, SheetDatas, _Label, {attr_addition, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
case cb_fun:get_val(is_use, Row) of
1 when Atom =:= "hp_max" -> {true, ?S("\t~-25s= max(util:uround(Attr#attr.~-25s * Param), 1)", [Atom, Atom])};
1 -> {true, ?S("\t~-25s= util:uround(Attr#attr.~-25s * Param)", [Atom, Atom])};
_ -> false
end
end, AllRows),
lists:concat(["attr_addition(Attr, Param) ->Attr#attr{\n", string:join(L, ",\n"), "\n}."]);
handle(_DataCfg, SheetDatas, _Label, {attr_uround, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
case cb_fun:get_val(is_use, Row) of
1 when Atom =:= "hp_max" -> {true, ?S("\t~-25s= max(util:uround(Attr#attr.~-25s), 1)", [Atom, Atom])};
1 -> {true, ?S("\t~-25s= util:uround(Attr#attr.~-25s)", [Atom, Atom])};
_ -> false
end
end, AllRows),
lists:concat(["attr_uround(Attr) ->Attr#attr{\n", string:join(L, ",\n"), "\n}."]);
handle(_DataCfg, SheetDatas, _Label, {base_power, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("\tattr_atom2power(~-25s) * Attr#attr.~s", [Atom, Atom])};
_ -> false
end
end, AllRows),
lists:concat(["base_power(Attr) -> \n", string:join(L, " + \n"), "\n."]);
handle(_DataCfg, SheetDatas, _Label, {partner_base_power, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
NotToPower = cb_fun:get_val(not_to_power, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("\tattr_atom2partner_power(~-25s) * max(Attr#attr.~s - ~s, 0)", [Atom, Atom, NotToPower])};
_ -> false
end
end, AllRows),
lists:concat(["partner_base_power(Attr) -> \n", string:join(L, " + \n"), "\n."]);
handle(_DataCfg, SheetDatas, _Label, {print_attr, Sheets}) ->
AllRows = gen_data_lib:all_rows(SheetDatas, Sheets),
L = lists:filtermap(fun(Row) ->
Atom = cb_fun:get_val(atom, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("\t?INFO(\"~-25s=~s\", [Attr#attr.~-25s]),", [Atom, "~w", Atom])};
_ -> false
end
end, AllRows),
lists:concat(["print_attr(Attr) -> \n", string:join(L, "\n"), "\n\tok."]);
handle(_DataCfg, _SheetDatas, _Label, {write_string, String}) -> %% 配置不到
String;
handle(_DataCfg, _SheetDatas, _Label, _Args) -> %% 配置不到
?P("匹配不到相关处理方法:~w", [_Args]),
error.
row_attr2per(Row) ->
Atom = cb_fun:get_val(atom, Row),
Desc = cb_fun:get_val(desc, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("attr2per(~25s) -> ~-25s; %% ~ts", [Atom, lists:concat([Atom,"_per"]), Desc])};
_ -> false
end.
row_attr_atom2power(Row) ->
Atom = cb_fun:get_val(atom, Row),
Power = cb_fun:get_val(power, Row),
{true, ?S("attr_atom2power(~-25s) -> ~s;", [Atom, Power])}.
row_attr_atom2partner_power(Row) ->
Atom = cb_fun:get_val(atom, Row),
Power = cb_fun:get_val(partner_power, Row),
{true, ?S("attr_atom2partner_power(~-25s) -> ~s;", [Atom, Power])}.
row_attr_atom2id(Row) ->
Atom = cb_fun:get_val(atom, Row),
Id = cb_fun:get_val(id, Row),
{true, ?S("attr_atom2id(~-25s) -> ~s;", [Atom, Id])}.
row_attr_atom2name(Row) ->
Atom = cb_fun:get_val(atom, Row),
Name = cb_fun:get_val(name, Row),
{true, ?S("attr_atom2name(~-25s) -> ~ts;", [Atom, Name])}.
row_add_attr_val(Row) ->
Atom = cb_fun:get_val(atom, Row),
Desc = cb_fun:get_val(desc, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("add_attr_val(Attr = #attr{~s = Val1}, ~s, Val) -> Attr#attr{~s = Val1 + Val}; %% ~ts", [Atom, Atom, Atom, Desc])};
_ -> false
end.
do_row(Row) ->
Atom = cb_fun:get_val(atom, Row),
Desc = cb_fun:get_val(desc, Row),
case cb_fun:get_val(is_use, Row) of
1 -> {true, ?S("get_attr_val(#attr{~25s = Val}, ~25s) -> Val; %% ~ts", [Atom, Atom, Desc])};
_ -> false
end.
row_do_sub1(Row) ->
Atom = cb_fun:get_val(atom, Row),
Type = cb_fun:get_val(type, Row),
Str = cb_fun:get_val(attr_list, Row),
case util:string_to_term(Str) of
{ok, L} ->
F1 = fun(I,Rec) ->
?S("~w=~s~w+Val", [I,Rec,I])
end,
case Type of
1 ->
{true, ?S("do_sub1({~s, Val}, ?attr_calc_val, _RType, AC = #attr_calc{attr = Attr = #attr{}}) -> {ok, AC#attr_calc{attr = Attr#attr{~s}}};\n", [Atom, string:join([F1(I,"Attr#attr.")||I<-L],",")])};
2 ->
{true, ?S("do_sub1({~s_per, Val}, _AType, ?attr_calc_ratio, AC = #attr_calc{ratio = Attr = #attr{}}) -> {ok, AC#attr_calc{ratio = Attr#attr{~s}}};\n", [Atom, string:join([F1(I,"Attr#attr.")||I<-L],",")])};
_ ->
{true, ?S("do_sub1({~s, Val}, ?attr_calc_val, ?attr_calc_ratio, AC = #attr_calc{attr = Attr, ratio = Ratio}) -> {ok, AC#attr_calc{attr = Attr#attr{~s}, ratio = Ratio#attr{~s}}};\n", [Atom,string:join([F1(I,"Attr#attr.")||I<-L],","), string:join([F1(I,"Ratio#attr.")||I<-L],",")])}
end;
_ -> false
end.
row_do_sub(Row) ->
Atom = cb_fun:get_val(atom, Row),
Desc = cb_fun:get_val(desc, Row),
case cb_fun:get_val(is_use, Row) of
1 ->
S1 = ?S("%% ~ts\ndo_sub({~s, Val}, ?attr_calc_val, _RType, AC = #attr_calc{attr = Attr = #attr{~s = V}}) -> {ok, AC#attr_calc{attr = Attr#attr{~s = V + Val}}};\n", [Desc, Atom, Atom, Atom]),
S2 = ?S("do_sub({~s, Val}, ?attr_calc_val_no_ratio, _RType, AC = #attr_calc{attr_no_ratio = Attr = #attr{~s = V}}) -> {ok, AC#attr_calc{attr_no_ratio = Attr#attr{~s = V + Val}}};\n", [Atom, Atom, Atom]),
S3 = ?S("do_sub({~s, Val}, ?attr_calc_val_no_fc, _RType, AC = #attr_calc{attr_no_fc = Attr = #attr{~s = V}}) -> {ok, AC#attr_calc{attr_no_fc = Attr#attr{~s = V + Val}}};\n", [Atom, Atom, Atom]),
S4 = ?S("do_sub({~s_per, Val}, _AType, ?attr_calc_ratio, AC = #attr_calc{ratio = Attr = #attr{~s = V}}) -> {ok, AC#attr_calc{ratio = Attr#attr{~s = V + Val}}};\n", [Atom, Atom, Atom]),
S5 = ?S("do_sub({~s_per, Val}, _AType, ?attr_calc_ratio_no_fc, AC = #attr_calc{ratio_no_fc = Attr = #attr{~s = V}}) -> {ok, AC#attr_calc{ratio_no_fc = Attr#attr{~s = V + Val}}};\n", [Atom, Atom, Atom]),
{true,lists:concat([S1,S2,S3,S4,S5])};
_ -> false
end.
val(atom_to_int) -> <<"atom_to_int(Attr) ->
?ERR(\" atom to int error ~w\", [Attr]),
undefined.">>;
val(int_to_atom) -> <<"int_to_atom(Id) ->
?ERR(\" int to atom error ~w\", [Id]),
undefined.">>;
val(do_sub) -> <<"do_sub(Sub, _AType, _RType, AC) ->
?ERR(\" 未知属性错误 ~w,~w\", [Sub, util:get_stacktrace()]),
{ok, AC}."/utf8>>;
val(do_sub1) -> <<"do_sub1(Sub, _AType, _RType, AC) ->
?ERR(\" 未知属性错误 ~w,~w\", [Sub, util:get_stacktrace()]),
{ok, AC}."/utf8>>;
val(do_sub_list) -> "do_sub_list(Sub, _AType, _RType, AC) ->
?ERR(\"do sub list error ~w,~w\", [Sub, util:get_stacktrace()]),
{ok, AC}.".
function_head(do_sub_list) -> "do_sub_list([], _AType, _RType, AC) -> {ok, AC};\ndo_sub_list([H | T], AType, RType, AC) ->\n\t {ok, AC1} = do_sub(H, AType, RType, AC), \n\t do_sub_list(T, AType, RType, AC1);".