Refactoring and clean up
This commit is contained in:
parent
fb1ab16682
commit
8155c2764a
|
@ -28,8 +28,8 @@ using namespace godot;
|
||||||
|
|
||||||
Ref<Blackboard> Blackboard::top() const {
|
Ref<Blackboard> Blackboard::top() const {
|
||||||
Ref<Blackboard> bb(this);
|
Ref<Blackboard> bb(this);
|
||||||
while (bb->get_parent_scope().is_valid()) {
|
while (bb->get_parent().is_valid()) {
|
||||||
bb = bb->get_parent_scope();
|
bb = bb->get_parent();
|
||||||
}
|
}
|
||||||
return bb;
|
return bb;
|
||||||
}
|
}
|
||||||
|
@ -45,11 +45,11 @@ Variant Blackboard::get_var(const String &p_name, const Variant &p_default) cons
|
||||||
}
|
}
|
||||||
|
|
||||||
void Blackboard::set_var(const String &p_name, const Variant &p_value) {
|
void Blackboard::set_var(const String &p_name, const Variant &p_value) {
|
||||||
// TODO: Check if p_value can be converted into required type!
|
|
||||||
if (data.has(p_name)) {
|
if (data.has(p_name)) {
|
||||||
|
// Not checking type - allowing duck-typing.
|
||||||
data[p_name].set_value(p_value);
|
data[p_name].set_value(p_value);
|
||||||
} else {
|
} else {
|
||||||
BBVariable var;
|
BBVariable var(p_value.get_type());
|
||||||
var.set_value(p_value);
|
var.set_value(p_value);
|
||||||
data.insert(p_name, var);
|
data.insert(p_name, var);
|
||||||
}
|
}
|
||||||
|
@ -85,11 +85,9 @@ void Blackboard::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("get_var", "p_name", "p_default"), &Blackboard::get_var, Variant());
|
ClassDB::bind_method(D_METHOD("get_var", "p_name", "p_default"), &Blackboard::get_var, Variant());
|
||||||
ClassDB::bind_method(D_METHOD("set_var", "p_name", "p_value"), &Blackboard::set_var);
|
ClassDB::bind_method(D_METHOD("set_var", "p_name", "p_value"), &Blackboard::set_var);
|
||||||
ClassDB::bind_method(D_METHOD("has_var", "p_name"), &Blackboard::has_var);
|
ClassDB::bind_method(D_METHOD("has_var", "p_name"), &Blackboard::has_var);
|
||||||
ClassDB::bind_method(D_METHOD("set_parent_scope", "p_blackboard"), &Blackboard::set_parent_scope);
|
ClassDB::bind_method(D_METHOD("set_parent_scope", "p_blackboard"), &Blackboard::set_parent);
|
||||||
ClassDB::bind_method(D_METHOD("get_parent_scope"), &Blackboard::get_parent_scope);
|
ClassDB::bind_method(D_METHOD("get_parent_scope"), &Blackboard::get_parent);
|
||||||
ClassDB::bind_method(D_METHOD("erase_var", "p_name"), &Blackboard::erase_var);
|
ClassDB::bind_method(D_METHOD("erase_var", "p_name"), &Blackboard::erase_var);
|
||||||
ClassDB::bind_method(D_METHOD("prefetch_nodepath_vars", "p_node"), &Blackboard::prefetch_nodepath_vars);
|
ClassDB::bind_method(D_METHOD("prefetch_nodepath_vars", "p_node"), &Blackboard::prefetch_nodepath_vars);
|
||||||
ClassDB::bind_method(D_METHOD("top"), &Blackboard::top);
|
ClassDB::bind_method(D_METHOD("top"), &Blackboard::top);
|
||||||
// ClassDB::bind_method(D_METHOD("get_data"), &Blackboard::get_data);
|
|
||||||
// ClassDB::bind_method(D_METHOD("set_data", "p_data"), &Blackboard::set_data);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,8 +42,8 @@ protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void set_parent_scope(const Ref<Blackboard> &p_blackboard) { parent = p_blackboard; }
|
void set_parent(const Ref<Blackboard> &p_blackboard) { parent = p_blackboard; }
|
||||||
Ref<Blackboard> get_parent_scope() const { return parent; }
|
Ref<Blackboard> get_parent() const { return parent; }
|
||||||
|
|
||||||
Ref<Blackboard> top() const;
|
Ref<Blackboard> top() const;
|
||||||
|
|
||||||
|
@ -56,9 +56,7 @@ public:
|
||||||
|
|
||||||
void prefetch_nodepath_vars(Node *p_node);
|
void prefetch_nodepath_vars(Node *p_node);
|
||||||
|
|
||||||
// TODO: Rework serialization API.
|
// TODO: Add serialization API.
|
||||||
// void set_data(const Dictionary &p_value);
|
|
||||||
// Dictionary get_data() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BLACKBOARD_H
|
#endif // BLACKBOARD_H
|
||||||
|
|
|
@ -63,7 +63,10 @@ bool BlackboardPlan::_get(const StringName &p_name, Variant &r_ret) const {
|
||||||
String var_name = prop_name.get_slicec('/', 1);
|
String var_name = prop_name.get_slicec('/', 1);
|
||||||
String what = prop_name.get_slicec('/', 2);
|
String what = prop_name.get_slicec('/', 2);
|
||||||
ERR_FAIL_COND_V(!data.has(var_name), false);
|
ERR_FAIL_COND_V(!data.has(var_name), false);
|
||||||
if (what == "type") {
|
|
||||||
|
if (what == "name") {
|
||||||
|
r_ret = var_name;
|
||||||
|
} else if (what == "type") {
|
||||||
r_ret = data[var_name].get_type();
|
r_ret = data[var_name].get_type();
|
||||||
} else if (what == "value") {
|
} else if (what == "value") {
|
||||||
r_ret = data[var_name].get_value();
|
r_ret = data[var_name].get_value();
|
||||||
|
@ -111,17 +114,6 @@ void BlackboardPlan::set_base_plan(const Ref<BlackboardPlan> &p_base) {
|
||||||
sync_with_base_plan();
|
sync_with_base_plan();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlackboardPlan::set_value(const String &p_name, const Variant &p_value) {
|
|
||||||
ERR_FAIL_COND(!data.has(p_name));
|
|
||||||
data.get(p_name).set_value(p_value);
|
|
||||||
emit_changed();
|
|
||||||
}
|
|
||||||
|
|
||||||
Variant BlackboardPlan::get_value(const String &p_name) const {
|
|
||||||
ERR_FAIL_COND_V(!data.has(p_name), Variant());
|
|
||||||
return data.get(p_name).get_value();
|
|
||||||
}
|
|
||||||
|
|
||||||
void BlackboardPlan::add_var(const String &p_name, const BBVariable &p_var) {
|
void BlackboardPlan::add_var(const String &p_name, const BBVariable &p_var) {
|
||||||
ERR_FAIL_COND(data.has(p_name));
|
ERR_FAIL_COND(data.has(p_name));
|
||||||
ERR_FAIL_COND(base.is_valid());
|
ERR_FAIL_COND(base.is_valid());
|
||||||
|
|
|
@ -39,9 +39,6 @@ public:
|
||||||
void set_base_plan(const Ref<BlackboardPlan> &p_base);
|
void set_base_plan(const Ref<BlackboardPlan> &p_base);
|
||||||
Ref<BlackboardPlan> get_base_plan() const { return base; }
|
Ref<BlackboardPlan> get_base_plan() const { return base; }
|
||||||
|
|
||||||
void set_value(const String &p_name, const Variant &p_value);
|
|
||||||
Variant get_value(const String &p_name) const;
|
|
||||||
|
|
||||||
void add_var(const String &p_name, const BBVariable &p_var);
|
void add_var(const String &p_name, const BBVariable &p_var);
|
||||||
void remove_var(const String &p_name);
|
void remove_var(const String &p_name);
|
||||||
BBVariable get_var(const String &p_name);
|
BBVariable get_var(const String &p_name);
|
||||||
|
|
|
@ -22,6 +22,11 @@
|
||||||
#include "godot_cpp/core/error_macros.hpp"
|
#include "godot_cpp/core/error_macros.hpp"
|
||||||
#endif // ! LIMBOAI_GDEXTENSION
|
#endif // ! LIMBOAI_GDEXTENSION
|
||||||
|
|
||||||
|
void BehaviorTree::set_description(const String &p_value) {
|
||||||
|
description = p_value;
|
||||||
|
emit_changed();
|
||||||
|
}
|
||||||
|
|
||||||
void BehaviorTree::set_blackboard_plan(const Ref<BlackboardPlan> &p_plan) {
|
void BehaviorTree::set_blackboard_plan(const Ref<BlackboardPlan> &p_plan) {
|
||||||
blackboard_plan = p_plan;
|
blackboard_plan = p_plan;
|
||||||
if (blackboard_plan.is_null()) {
|
if (blackboard_plan.is_null()) {
|
||||||
|
@ -30,6 +35,11 @@ void BehaviorTree::set_blackboard_plan(const Ref<BlackboardPlan> &p_plan) {
|
||||||
emit_changed();
|
emit_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BehaviorTree::set_root_task(const Ref<BTTask> &p_value) {
|
||||||
|
root_task = p_value;
|
||||||
|
emit_changed();
|
||||||
|
}
|
||||||
|
|
||||||
Ref<BehaviorTree> BehaviorTree::clone() const {
|
Ref<BehaviorTree> BehaviorTree::clone() const {
|
||||||
Ref<BehaviorTree> copy = duplicate(false);
|
Ref<BehaviorTree> copy = duplicate(false);
|
||||||
copy->set_path("");
|
copy->set_path("");
|
||||||
|
@ -64,8 +74,8 @@ void BehaviorTree::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("instantiate", "p_agent", "p_blackboard"), &BehaviorTree::instantiate);
|
ClassDB::bind_method(D_METHOD("instantiate", "p_agent", "p_blackboard"), &BehaviorTree::instantiate);
|
||||||
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::STRING, "description", PROPERTY_HINT_MULTILINE_TEXT), "set_description", "get_description");
|
ADD_PROPERTY(PropertyInfo(Variant::STRING, "description", PROPERTY_HINT_MULTILINE_TEXT), "set_description", "get_description");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "root_task", PROPERTY_HINT_RESOURCE_TYPE, "BTTask", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "set_root_task", "get_root_task");
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "blackboard_plan", PROPERTY_HINT_RESOURCE_TYPE, "BlackboardPlan", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT), "set_blackboard_plan", "get_blackboard_plan");
|
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "blackboard_plan", PROPERTY_HINT_RESOURCE_TYPE, "BlackboardPlan", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT), "set_blackboard_plan", "get_blackboard_plan");
|
||||||
|
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "root_task", PROPERTY_HINT_RESOURCE_TYPE, "BTTask", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "set_root_task", "get_root_task");
|
||||||
}
|
}
|
||||||
|
|
||||||
BehaviorTree::BehaviorTree() {
|
BehaviorTree::BehaviorTree() {
|
||||||
|
|
|
@ -40,19 +40,13 @@ public:
|
||||||
virtual bool editor_can_reload_from_file() override { return false; }
|
virtual bool editor_can_reload_from_file() override { return false; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void set_description(const String &p_value);
|
||||||
|
String get_description() const { return description; }
|
||||||
|
|
||||||
void set_blackboard_plan(const Ref<BlackboardPlan> &p_plan);
|
void set_blackboard_plan(const Ref<BlackboardPlan> &p_plan);
|
||||||
Ref<BlackboardPlan> get_blackboard_plan() const { return blackboard_plan; }
|
Ref<BlackboardPlan> get_blackboard_plan() const { return blackboard_plan; }
|
||||||
|
|
||||||
void set_description(String p_value) {
|
void set_root_task(const Ref<BTTask> &p_value);
|
||||||
description = p_value;
|
|
||||||
emit_changed();
|
|
||||||
}
|
|
||||||
String get_description() const { return description; }
|
|
||||||
|
|
||||||
void set_root_task(const Ref<BTTask> &p_value) {
|
|
||||||
root_task = p_value;
|
|
||||||
emit_changed();
|
|
||||||
}
|
|
||||||
Ref<BTTask> get_root_task() const { return root_task; }
|
Ref<BTTask> get_root_task() const { return root_task; }
|
||||||
|
|
||||||
Ref<BehaviorTree> clone() const;
|
Ref<BehaviorTree> clone() const;
|
||||||
|
|
|
@ -22,7 +22,7 @@ void BTNewScope::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard)
|
||||||
bb = Ref<Blackboard>(memnew(Blackboard));
|
bb = Ref<Blackboard>(memnew(Blackboard));
|
||||||
}
|
}
|
||||||
|
|
||||||
bb->set_parent_scope(p_blackboard);
|
bb->set_parent(p_blackboard);
|
||||||
|
|
||||||
BTDecorator::initialize(p_agent, bb);
|
BTDecorator::initialize(p_agent, bb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="1_rhs33"]
|
[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="1_rhs33"]
|
||||||
|
|
||||||
[sub_resource type="BlackboardPlan" id="BlackboardPlan_2hcqi"]
|
[sub_resource type="BlackboardPlan" id="BlackboardPlan_2hcqi"]
|
||||||
var/speed/name = null
|
var/speed/name = "speed"
|
||||||
var/speed/type = 3
|
var/speed/type = 3
|
||||||
var/speed/value = 200.0
|
var/speed/value = 200.0
|
||||||
var/speed/hint = 1
|
var/speed/hint = 1
|
||||||
|
@ -43,5 +43,5 @@ duration = 3.0
|
||||||
children = [SubResource("BTCooldown_gen0l")]
|
children = [SubResource("BTCooldown_gen0l")]
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
root_task = SubResource("BTSelector_5dclr")
|
|
||||||
blackboard_plan = SubResource("BlackboardPlan_2hcqi")
|
blackboard_plan = SubResource("BlackboardPlan_2hcqi")
|
||||||
|
root_task = SubResource("BTSelector_5dclr")
|
||||||
|
|
|
@ -24,5 +24,3 @@ func _ready() -> void:
|
||||||
waypoints.reverse()
|
waypoints.reverse()
|
||||||
for wp in waypoints:
|
for wp in waypoints:
|
||||||
agent2.add_waypoint(wp.global_position)
|
agent2.add_waypoint(wp.global_position)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
[ext_resource type="Texture2D" uid="uid://d0mht3ntak7e5" path="res://demo/godot.png" id="3_64ge2"]
|
[ext_resource type="Texture2D" uid="uid://d0mht3ntak7e5" path="res://demo/godot.png" id="3_64ge2"]
|
||||||
|
|
||||||
[sub_resource type="BlackboardPlan" id="BlackboardPlan_b86q8"]
|
[sub_resource type="BlackboardPlan" id="BlackboardPlan_b86q8"]
|
||||||
var/speed/name = null
|
var/speed/name = "speed"
|
||||||
var/speed/type = 3
|
var/speed/type = 3
|
||||||
var/speed/value = 200.0
|
var/speed/value = 300.0
|
||||||
var/speed/hint = 1
|
var/speed/hint = 1
|
||||||
var/speed/hint_string = "10,1000,10"
|
var/speed/hint_string = "10,1000,10"
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@ private:
|
||||||
} theme_cache;
|
} theme_cache;
|
||||||
|
|
||||||
int last_index = 0;
|
int last_index = 0;
|
||||||
|
|
||||||
int drag_mouse_y_delta = 0;
|
int drag_mouse_y_delta = 0;
|
||||||
int drag_index = -1;
|
int drag_index = -1;
|
||||||
|
|
||||||
|
|
|
@ -190,7 +190,7 @@ bool LimboHSM::dispatch(const String &p_event, const Variant &p_cargo) {
|
||||||
void LimboHSM::initialize(Node *p_agent, const Ref<Blackboard> &p_parent_scope) {
|
void LimboHSM::initialize(Node *p_agent, const Ref<Blackboard> &p_parent_scope) {
|
||||||
ERR_FAIL_COND(p_agent == nullptr);
|
ERR_FAIL_COND(p_agent == nullptr);
|
||||||
if (!p_parent_scope.is_null()) {
|
if (!p_parent_scope.is_null()) {
|
||||||
blackboard->set_parent_scope(p_parent_scope);
|
blackboard->set_parent(p_parent_scope);
|
||||||
}
|
}
|
||||||
_initialize(p_agent, nullptr);
|
_initialize(p_agent, nullptr);
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@ void LimboState::_initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard)
|
||||||
if (!p_blackboard.is_null()) {
|
if (!p_blackboard.is_null()) {
|
||||||
if (blackboard_plan.is_valid() && !blackboard_plan->is_empty()) {
|
if (blackboard_plan.is_valid() && !blackboard_plan->is_empty()) {
|
||||||
blackboard = blackboard_plan->create_blackboard();
|
blackboard = blackboard_plan->create_blackboard();
|
||||||
blackboard->set_parent_scope(p_blackboard);
|
blackboard->set_parent(p_blackboard);
|
||||||
} else {
|
} else {
|
||||||
blackboard = p_blackboard;
|
blackboard = p_blackboard;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ TEST_CASE("[Modules][LimboAI] BTNewScope") {
|
||||||
CHECK(ns->get_blackboard() != parent->get_blackboard());
|
CHECK(ns->get_blackboard() != parent->get_blackboard());
|
||||||
CHECK(ns->get_blackboard() == child->get_blackboard());
|
CHECK(ns->get_blackboard() == child->get_blackboard());
|
||||||
CHECK(parent->get_blackboard() == parent_bb);
|
CHECK(parent->get_blackboard() == parent_bb);
|
||||||
CHECK(ns->get_blackboard()->get_parent_scope() == parent_bb);
|
CHECK(ns->get_blackboard()->get_parent() == parent_bb);
|
||||||
|
|
||||||
ns->get_blackboard()->set_var("fruit", "pear"); // * override "fruit"
|
ns->get_blackboard()->set_var("fruit", "pear"); // * override "fruit"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue