Fix bt::conditional node: proper assert handling & child nodes starting

This commit is contained in:
Nikita Lisitsa 2024-12-07 20:05:16 +03:00
parent 6d4abb7c03
commit 89cbbaeeef

View file

@ -35,24 +35,35 @@ namespace psemek::bt
status update(Time dt, Args ... args) override status update(Time dt, Args ... args) override
{ {
if (condition_result_) try
{ {
if (*condition_result_) if (condition_result_)
return true_branch_->update(dt, args...);
else
return false_branch_->update(dt, args...);
}
else
{
auto result = condition_->update(dt, args...);
if (auto finished = std::get_if<typename node_type::finished>(&result))
{ {
condition_result_ = finished->result; if (*condition_result_)
return running{}; return true_branch_->update(dt, args...);
else
return false_branch_->update(dt, args...);
} }
else
{
auto result = condition_->update(dt, args...);
return result; if (auto finished = std::get_if<typename node_type::finished>(&result))
{
condition_result_ = finished->result;
if (*condition_result_)
true_branch_->start(args...);
else
false_branch_->start(args...);
return running{};
}
return result;
}
}
catch (assertion_failed_exception const &)
{
return finished{false};
} }
} }