%% @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).
|
|
|