153 lines
5.6 KiB
C++
153 lines
5.6 KiB
C++
#include "stdafx.h"
|
|
#include "BigThink.h"
|
|
|
|
#include "Behaviour.h"
|
|
#include "BehaviourTree.h"
|
|
|
|
namespace BigThink
|
|
{
|
|
constexpr float HpThreshold{ 8.f }; // TODO: Make this a parameter
|
|
|
|
BT::Sequence* PurgeZoneHandling() {
|
|
constexpr int searchDegree{ 45 };
|
|
return
|
|
new BT::Sequence({
|
|
new BT::Conditional(BT_Condition::SeePurgeZone),
|
|
new BT::Action(std::bind(BT_Action::FindClosestEdge, std::placeholders::_1, searchDegree)),
|
|
new BT::Action(BT_Action::GoToTarget)
|
|
});
|
|
}
|
|
|
|
BT::Selector* ItemHandling() {
|
|
return
|
|
new BT::Selector({
|
|
new BT::Sequence({
|
|
new BT::Conditional(std::bind(BT_Condition::ItemInInv, std::placeholders::_1, eItemType::MEDKIT)),
|
|
new BT::Conditional(std::bind(BT_Condition::HpUnderThreshold, std::placeholders::_1, HpThreshold)),
|
|
new BT::Action(std::bind(BT_Action::UseItem, std::placeholders::_1, eItemType::MEDKIT))
|
|
}),
|
|
new BT::Sequence({
|
|
new BT::Conditional(std::bind(BT_Condition::ItemInInv, std::placeholders::_1, eItemType::FOOD)),
|
|
new BT::Conditional(BT_Condition::CheckMinNeededEnergy),
|
|
new BT::Action(std::bind(BT_Action::UseItem, std::placeholders::_1, eItemType::FOOD))
|
|
})
|
|
});
|
|
}
|
|
|
|
BT::PartialSequence* PickUpHandling() {
|
|
return
|
|
new BT::PartialSequence({
|
|
new BT::Conditional(BT_Condition::SeeItem),
|
|
new BT::Action(BT_Action::DisableSpin),
|
|
new BT::Action(BT_Action::SetItemAsTarget),
|
|
new BT::Action(BT_Action::GoToTarget),
|
|
new BT::Selector({
|
|
new BT::Sequence({
|
|
new BT::Conditional(std::bind(BT_Condition::IsTypeOfItem, std::placeholders::_1, eItemType::GARBAGE)),
|
|
new BT::Action(BT_Action::DestroyItemOnFloor)
|
|
}),
|
|
new BT::Sequence({
|
|
new BT::Conditional(BT_Condition::EmptyValue),
|
|
new BT::Action(BT_Action::SwapItem)
|
|
}),
|
|
new BT::Sequence({
|
|
new BT::Conditional(BT_Condition::InvIsNotFull),
|
|
new BT::Action(BT_Action::PickUpItem)
|
|
}),
|
|
new BT::Sequence({
|
|
new BT::Conditional(BT_Condition::InvIsFull),
|
|
new BT::Selector({
|
|
new BT::Sequence({
|
|
new BT::Conditional(std::bind(BT_Condition::IsTypeOfItem, std::placeholders::_1, eItemType::FOOD)),
|
|
new BT::Action(BT_Action::CheckItem)
|
|
}),
|
|
new BT::Sequence({
|
|
new BT::Conditional(std::bind(BT_Condition::IsTypeOfItem, std::placeholders::_1, eItemType::MEDKIT)),
|
|
new BT::Action(BT_Action::CheckItem)
|
|
}),
|
|
new BT::Sequence({
|
|
new BT::Conditional(std::bind(BT_Condition::IsTypeOfItem, std::placeholders::_1, eItemType::SHOTGUN)),
|
|
new BT::Action(BT_Action::CheckItem)
|
|
}),
|
|
new BT::Sequence({
|
|
new BT::Conditional(std::bind(BT_Condition::IsTypeOfItem, std::placeholders::_1, eItemType::PISTOL)),
|
|
new BT::Action(BT_Action::CheckItem)
|
|
})
|
|
})
|
|
})
|
|
})
|
|
});
|
|
}
|
|
|
|
BT::Selector* HouseHandling() {
|
|
constexpr float maxTravelDistance{ 100.f };
|
|
constexpr int searchRadius{ 300 };
|
|
constexpr int searchDegree{ 45 }; //TODO
|
|
constexpr float InsideOffset{ 5.f };
|
|
|
|
const std::string BeforeLeavingTimer{ "BeforeLeaving" };
|
|
constexpr bool BeforeLeavingDoOnce{ true };
|
|
|
|
return
|
|
new BT::Selector({
|
|
new BT::PartialSequence({
|
|
new BT::Conditional(BT_Condition::InsideTargetHouse),
|
|
new BT::Action(BT_Action::SetExpireDate),
|
|
new BT::Action(std::bind(BT_Action::SetTimer, std::placeholders::_1, BeforeLeavingTimer, BeforeLeavingDoOnce)),
|
|
new BT::Selector({
|
|
new BT::PartialSequence({
|
|
new BT::Conditional(std::bind(BT_Condition::CheckTimer, std::placeholders::_1, BeforeLeavingTimer, BeforeLeavingDoOnce)),
|
|
new BT::Selector({
|
|
new BT::PartialSequence({
|
|
new BT::Conditional(BT_Condition::NewHouse),
|
|
new BT::Action(std::bind(BT_Action::GetHouseAsTarget, std::placeholders::_1, maxTravelDistance)),
|
|
new BT::Action(BT_Action::EnableSpin),
|
|
new BT::Action(BT_Action::GoToTarget),
|
|
}),
|
|
new BT::PartialSequence({
|
|
new BT::Conditional(BT_Condition::ReExploreHouse),
|
|
new BT::Action(std::bind(BT_Action::GetHouseAsTarget, std::placeholders::_1, maxTravelDistance)),
|
|
new BT::Action(BT_Action::EnableSpin),
|
|
new BT::Action(BT_Action::GoToTarget),
|
|
}),
|
|
new BT::PartialSequence({
|
|
new BT::Action(std::bind(BT_Action::TryFindHouse, std::placeholders::_1, searchRadius, searchDegree)),
|
|
new BT::Action(BT_Action::EnableSpin),
|
|
new BT::Action(BT_Action::GoToTarget)
|
|
})
|
|
}),
|
|
}),
|
|
new BT::PartialSequence({
|
|
new BT::Action(std::bind(BT_Action::GetInsideTarget, std::placeholders::_1, InsideOffset)),
|
|
new BT::Action(BT_Action::EnableSpin),
|
|
new BT::Action(BT_Action::GoToTarget)
|
|
}),
|
|
})
|
|
}),
|
|
new BT::Sequence({
|
|
new BT::Conditional(BT_Condition::SeeHouse),
|
|
new BT::Action(BT_Action::CheckHouses)
|
|
}),
|
|
new BT::Selector({
|
|
new BT::PartialSequence({
|
|
new BT::Conditional(BT_Condition::NewHouse),
|
|
new BT::Action(std::bind(BT_Action::GetHouseAsTarget, std::placeholders::_1, maxTravelDistance)),
|
|
new BT::Action(BT_Action::EnableSpin),
|
|
new BT::Action(BT_Action::GoToTarget),
|
|
}),
|
|
new BT::PartialSequence({
|
|
new BT::Conditional(BT_Condition::ReExploreHouse),
|
|
new BT::Action(std::bind(BT_Action::GetHouseAsTarget, std::placeholders::_1, maxTravelDistance)),
|
|
new BT::Action(BT_Action::EnableSpin),
|
|
new BT::Action(BT_Action::GoToTarget),
|
|
})
|
|
}),
|
|
new BT::PartialSequence({
|
|
new BT::Action(std::bind(BT_Action::TryFindHouse, std::placeholders::_1, searchRadius, searchDegree)),
|
|
new BT::Action(BT_Action::EnableSpin),
|
|
new BT::Action(BT_Action::GoToTarget)
|
|
})
|
|
});
|
|
}
|
|
}
|