55 lines
1.5 KiB
C++
55 lines
1.5 KiB
C++
|
/* behavior_tree_data.cpp */
|
||
|
|
||
|
#include "behavior_tree_data.h"
|
||
|
#include "core/templates/list.h"
|
||
|
|
||
|
//// BehaviorTreeData
|
||
|
|
||
|
BehaviorTreeData::BehaviorTreeData(const Ref<BTTask> &p_instance) {
|
||
|
// Flatten tree into list depth first
|
||
|
List<Ref<BTTask>> stack;
|
||
|
stack.push_back(p_instance);
|
||
|
while (stack.size()) {
|
||
|
Ref<BTTask> task = stack[0];
|
||
|
stack.pop_front();
|
||
|
|
||
|
int num_children = task->get_child_count();
|
||
|
for (int i = 0; i < num_children; i++) {
|
||
|
stack.push_front(task->get_child(num_children - 1 - i));
|
||
|
}
|
||
|
|
||
|
tasks.push_back(TaskData(
|
||
|
task->get_task_name(),
|
||
|
num_children,
|
||
|
task->get_status(),
|
||
|
task->get_last_tick_usec(),
|
||
|
task->get_class()));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void BehaviorTreeData::serialize(Array &p_arr) {
|
||
|
for (const TaskData &td : tasks) {
|
||
|
p_arr.push_back(td.name);
|
||
|
p_arr.push_back(td.num_children);
|
||
|
p_arr.push_back(td.status);
|
||
|
p_arr.push_back(td.last_tick_usec);
|
||
|
p_arr.push_back(td.type_name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void BehaviorTreeData::deserialize(const Array &p_arr) {
|
||
|
ERR_FAIL_COND(tasks.size() != 0);
|
||
|
|
||
|
int idx = 0;
|
||
|
while (p_arr.size() > idx) {
|
||
|
ERR_FAIL_COND(p_arr.size() < 5);
|
||
|
ERR_FAIL_COND(p_arr[idx].get_type() != Variant::STRING);
|
||
|
ERR_FAIL_COND(p_arr[idx + 1].get_type() != Variant::INT);
|
||
|
ERR_FAIL_COND(p_arr[idx + 2].get_type() != Variant::INT);
|
||
|
ERR_FAIL_COND(p_arr[idx + 3].get_type() != Variant::INT);
|
||
|
ERR_FAIL_COND(p_arr[idx + 4].get_type() != Variant::STRING);
|
||
|
tasks.push_back(TaskData(p_arr[idx], p_arr[idx + 1], p_arr[idx + 2], p_arr[idx + 3], p_arr[idx + 4]));
|
||
|
idx += 5;
|
||
|
}
|
||
|
}
|