#include "pch.h" #include "BehaviorTreeOptimized.h" #include using namespace BTOptimized; void BehaviorTree::Tick() { Root->Tick(); } BehaviorTreeBuilder* BehaviorTreeBuilder::Sequence() { Behavior* Sq = Bt->Allocate(); AddBehavior(Sq); return this; } BehaviorTreeBuilder* BehaviorTreeBuilder::Action(EActionMode ActionModes) { Behavior* Ac; switch (ActionModes) { case EActionMode::Attack: Ac = Bt->Allocate();; break; case EActionMode::Patrol: Ac = Bt->Allocate(); break; case EActionMode::Runaway: Ac = Bt->Allocate(); break; default: Ac = nullptr; break; } AddBehavior(Ac); return this; } BehaviorTreeBuilder* BehaviorTreeBuilder::Condition(EConditionMode ConditionMode, bool IsNegation) { Behavior* Cd; switch (ConditionMode) { case EConditionMode::IsSeeEnemy: Cd = Bt->Allocate(IsNegation); break; case EConditionMode::IsHealthLow: Cd = Bt->Allocate(IsNegation); break; case EConditionMode::IsEnemyDead: Cd = Bt->Allocate(IsNegation); break; default: Cd = nullptr; break; } AddBehavior(Cd); return this; } BehaviorTreeBuilder* BehaviorTreeBuilder::Selector() { Behavior* St = Bt->Allocate(); AddBehavior(St); return this; } BehaviorTreeBuilder* BehaviorTreeBuilder::Repeat(int RepeatNum) { Behavior* Rp = Bt->Allocate(RepeatNum); AddBehavior(Rp); return this; } BehaviorTreeBuilder* BehaviorTreeBuilder::ActiveSelector() { Behavior* Ast = Bt->Allocate(); AddBehavior(Ast); return this; } BehaviorTreeBuilder* BehaviorTreeBuilder::Parallel(EPolicy InSucess, EPolicy InFailure) { Behavior* Pl = Bt->Allocate(InSucess, InFailure); AddBehavior(Pl); return this; } BehaviorTreeBuilder* BehaviorTreeBuilder::Back() { NodeStack.pop(); return this; } BehaviorTree* BehaviorTreeBuilder::End() { while (!NodeStack.empty()) { NodeStack.pop(); } return Bt; } void BehaviorTreeBuilder::AddBehavior(Behavior* NewBehavior) { assert(NewBehavior); if (!Bt->HaveRoot()) { Bt->SetRoot(NewBehavior); } else { NodeStack.top()->AddChild(NewBehavior); } NodeStack.push(NewBehavior); }