You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

73 regels
1.9 KiB

%% @author zouv
%% @doc use bte for ai
-module(bte_ai).
-include_lib("erlbte/include/common.hrl").
-export([
init/1,
tick/1
]).
init(Data) ->
{ok, Json, _} = rfc4627:decode(Data), % depend on rfc4627_jsonrpc
RootId = get_field_string(Json, "root"),
{ok, NodesJson} = rfc4627:get_field(Json, "nodes"),
NodeList = init_nodes([RootId], NodesJson, []),
CustomNodesModule = bte_node_behaviour:init_nodes_moudle(?MODULE), % load self-defined bte node
BteConfigData =
#r_bte_config_data{
root_id = RootId,
nodes = NodeList,
custom_nodes_moudle = CustomNodesModule
},
BteStatus = bte_behavior:init(BteConfigData),
{ok, BteStatus}.
init_nodes([], _NodesJson, NodeList) ->
NodeList;
init_nodes([Id | LeftIdList], NodesJson, NodeList) ->
{ok, NodeJson} = rfc4627:get_field(NodesJson, Id),
Name = get_field_string(NodeJson, "name"),
{ok, Parameters} = rfc4627:get_field(NodeJson, "parameters"),
ChildId = binary_to_list(rfc4627:get_field(NodeJson, "child", <<>>)),
Children = lists:map(fun(E) -> binary_to_list(E) end, rfc4627:get_field(NodeJson, "children", [])),
BteNode =
#r_bte_config_node{
id = Id,
name = Name,
parameters = get_all(Parameters),
child = ChildId,
children = Children
},
NewNodeList = [BteNode | NodeList],
if
ChildId /= "" ->
init_nodes([ChildId | LeftIdList], NodesJson, NewNodeList);
Children /= [] ->
init_nodes(Children ++ LeftIdList, NodesJson, NewNodeList);
true ->
init_nodes(LeftIdList, NodesJson, NewNodeList)
end.
get_field_string(Json, Key) ->
{ok, Value} = rfc4627:get_field(Json, Key),
binary_to_list(Value).
get_all(Parameters) ->
{obj, PrapList} = Parameters,
lists:map(fun({EKey, EValue}) ->
if
is_binary(EValue) ->
ENewValue = binary_to_list(EValue);
true ->
ENewValue = EValue
end,
{EKey, ENewValue}
end,
PrapList).
tick(BteStatus) ->
bte_behavior:tick(BteStatus).