diff options
Diffstat (limited to 'source/game/scripting/StarBehaviorLuaBindings.cpp')
-rw-r--r-- | source/game/scripting/StarBehaviorLuaBindings.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/source/game/scripting/StarBehaviorLuaBindings.cpp b/source/game/scripting/StarBehaviorLuaBindings.cpp new file mode 100644 index 0000000..8866746 --- /dev/null +++ b/source/game/scripting/StarBehaviorLuaBindings.cpp @@ -0,0 +1,37 @@ +#include "StarBehaviorLuaBindings.hpp" +#include "StarLuaGameConverters.hpp" +#include "StarRoot.hpp" + +namespace Star { + +LuaCallbacks LuaBindings::makeBehaviorLuaCallbacks(List<BehaviorStatePtr>* list) { + LuaCallbacks callbacks; + + callbacks.registerCallback("behavior", [list](Json const& config, JsonObject const& parameters, LuaTable context, Maybe<LuaUserData> blackboard) -> BehaviorStateWeakPtr { + auto behaviorDatabase = Root::singleton().behaviorDatabase(); + Maybe<BlackboardWeakPtr> board = {}; + if (blackboard && blackboard->is<BlackboardWeakPtr>()) + board = blackboard->get<BlackboardWeakPtr>(); + + BehaviorTreeConstPtr tree; + if (config.isType(Json::Type::String)) { + if (parameters.empty()) { + tree = behaviorDatabase->behaviorTree(config.toString()); + } else { + JsonObject treeConfig = behaviorDatabase->behaviorConfig(config.toString()).toObject(); + treeConfig.set("parameters", jsonMerge(treeConfig.get("parameters"), parameters)); + tree = behaviorDatabase->buildTree(treeConfig); + } + } else { + tree = behaviorDatabase->buildTree(config.set("parameters", jsonMerge(config.getObject("parameters", {}), parameters))); + } + + BehaviorStatePtr state = make_shared<BehaviorState>(tree, context, board); + list->append(state); + return weak_ptr<BehaviorState>(state); + }); + + return callbacks; +} + +} |