we shooting

This commit is contained in:
Bram verhulst
2025-05-27 09:56:10 +02:00
parent d5262a332d
commit 1d2ca4f9ca
11 changed files with 433 additions and 46 deletions

View File

@@ -93,7 +93,17 @@ namespace BT_Action
}
BT::State EnableSpin(Blackboard* blackboardPtr) {
IExamInterface* interfacePtr{};
SteeringPlugin_Output steering{};
blackboardPtr->GetData("Interface", interfacePtr);
blackboardPtr->GetData("Steering", steering);
steering.AutoOrient = true;
steering.AngularVelocity = interfacePtr->Agent_GetInfo().MaxAngularSpeed;
blackboardPtr->ChangeData("Spin", true);
blackboardPtr->ChangeData("Steering", steering);
return BT::State::Success;
}
@@ -104,6 +114,7 @@ namespace BT_Action
return BT::State::Success;
}
BT::State FindClosestEdge(Blackboard* blackboardPtr, int degree) {
IExamInterface* interfacePtr{};
blackboardPtr->GetData("Interface", interfacePtr);
@@ -138,6 +149,106 @@ namespace BT_Action
return BT::State::Success;
}
BT::State SetZombieTarget(Blackboard* blackboardPtr) {
IExamInterface* interfacePtr{};
blackboardPtr->GetData("Interface", interfacePtr);
if (interfacePtr->GetEnemiesInFOV().capacity() == 0) {
return BT::State::Failure;
}
EnemyInfo zombieInfo{};
float closestZombie{ FLT_MAX };
for (const auto zombie : interfacePtr->GetEnemiesInFOV()) {
const float distance{ interfacePtr->Agent_GetInfo().Position.DistanceSquared(zombie.Location) };
if (closestZombie < distance)
continue;
closestZombie = distance;
zombieInfo = zombie;
}
blackboardPtr->ChangeData("TargetZombie", zombieInfo);
return BT::State::Success;
}
BT::State AvoidingZombie(Blackboard* blackboardPtr) {
IExamInterface* interfacePtr{};
SteeringPlugin_Output steering{};
blackboardPtr->GetData("Interface", interfacePtr);
blackboardPtr->GetData("Steering", steering);
Elite::Vector2 evadeDirection{};
for (auto zombie : interfacePtr->GetEnemiesInFOV()) {
Elite::Vector2 currentPos{ interfacePtr->Agent_GetInfo().Position };
Elite::Vector2 targetPos{ zombie.Location };
Elite::Vector2 goingAwayVec{ currentPos - targetPos };
float distance = goingAwayVec.MagnitudeSquared();
evadeDirection += goingAwayVec / distance;
}
steering.LinearVelocity = evadeDirection.GetNormalized() * interfacePtr->Agent_GetInfo().MaxLinearSpeed;
blackboardPtr->ChangeData("Steering", steering);
return BT::State::Success;
}
BT::State RotateToZombie(Blackboard* blackboardPtr) {
IExamInterface* interfacePtr{};
EnemyInfo zombieInfo{};
SteeringPlugin_Output steering{};
blackboardPtr->GetData("Interface", interfacePtr);
blackboardPtr->GetData("TargetZombie", zombieInfo);
blackboardPtr->GetData("Steering", steering);
const float maxAngularVelocity{ interfacePtr->Agent_GetInfo().MaxAngularSpeed };
const float targetAngle{ VectorToOrientation((zombieInfo.Location - interfacePtr->Agent_GetInfo().Position).GetNormalized()) };
const float angleDiff{ targetAngle - interfacePtr->Agent_GetInfo().Orientation };
steering.AngularVelocity = angleDiff * maxAngularVelocity;
blackboardPtr->ChangeData("Steering", steering);
blackboardPtr->ChangeData("angleDiff", angleDiff);
return BT::State::Success;
}
BT::State ReadyToShoot(Blackboard* blackboardPtr, float minAngleDiff) {
float angleDiff{};
blackboardPtr->GetData("angleDiff", angleDiff);
return (std::abs(angleDiff) < minAngleDiff) ? BT::State::Success : BT::State::Failure;
}
BT::State Shoot(Blackboard* blackboardPtr, eItemType type) {
IExamInterface* interfacePtr{};
Thinker* thinkerPtr{};
blackboardPtr->GetData("Interface", interfacePtr);
blackboardPtr->GetData("Brain", thinkerPtr);
const auto item = thinkerPtr->FindLeastValueItem(type);
if (item->ItemInfo.Value <= 0)
return BT::State::Failure;
if (interfacePtr->Inventory_UseItem(item->invIndex)) {
--item->ItemInfo.Value;
return BT::State::Success;
}
return BT::State::Failure;
}
BT::State SetItemAsTarget(Blackboard* blackboardPtr) {
IExamInterface* interfacePtr{};
blackboardPtr->GetData("Interface", interfacePtr);
@@ -150,12 +261,12 @@ namespace BT_Action
float closestItem{ FLT_MAX };
for (const auto item : interfacePtr->GetItemsInFOV()) {
const float itemDistance{ interfacePtr->Agent_GetInfo().Position.DistanceSquared(item.Location) };
const float distance{ interfacePtr->Agent_GetInfo().Position.DistanceSquared(item.Location) };
if (closestItem < itemDistance)
if (closestItem < distance)
continue;
closestItem = itemDistance;
closestItem = distance;
targetItem = item;
}
@@ -304,6 +415,11 @@ namespace BT_Action
const Elite::Vector2 pointOnCircle{ playerPos.x + searchRadius * std::cosf(TO_RAD(i)), playerPos.y + searchRadius * std::sinf(TO_RAD(i)) };
const Elite::Vector2 target = interfacePtr->NavMesh_GetClosestPathPoint(pointOnCircle);
if (target == Elite::Vector2(400, 400)) {
std::cout << pointOnCircle << std::endl;
}
if (pointOnCircle != target) {
constexpr float houseOffset{ 5.f };
if (thinkerPtr->CheckIfTargetIsExplored(target, houseOffset))
@@ -319,8 +435,7 @@ namespace BT_Action
}
if (finalTarget == Elite::Vector2{}) {
finalTarget = Elite::Vector2(randNumRange(-searchRadius, searchRadius),
randNumRange(-searchRadius, searchRadius));
return BT::State::Failure;
}
blackboardPtr->ChangeData("Target", finalTarget);
@@ -328,6 +443,19 @@ namespace BT_Action
return BT::State::Success;
}
BT::State FindRandomLocation(Blackboard* blackboardPtr, float randomRadius) {
IExamInterface* interfacePtr{};
blackboardPtr->GetData("Interface", interfacePtr);
const Elite::Vector2 playerPos{ interfacePtr->Agent_GetInfo().Position };
Elite::Vector2 target = Elite::Vector2(playerPos.x + randNumRange(-randomRadius, randomRadius),
playerPos.y + randNumRange(-randomRadius, randomRadius));
blackboardPtr->ChangeData("Target", target);
return BT::State::Success;
}
BT::State GetHouseAsTarget(Blackboard* blackboardPtr, float maxTravelDistance) {
IExamInterface* interfacePtr{};
Thinker* thinkerPtr{};
@@ -418,6 +546,29 @@ namespace BT_Condition
return false;
}
bool SeeZombie(Blackboard* blackboardPtr) {
IExamInterface* interfacePtr{};
blackboardPtr->GetData("Interface", interfacePtr);
return interfacePtr->GetEnemiesInFOV().capacity() > 0;
}
bool HasWeapon(Blackboard* blackboardPtr) {
return ItemInInv(blackboardPtr, eItemType::SHOTGUN) || ItemInInv(blackboardPtr, eItemType::PISTOL);
}
bool InRange(Blackboard* blackboardPtr, float maxRange) {
IExamInterface* interfacePtr{};
EnemyInfo zombieInfo{};
blackboardPtr->GetData("Interface", interfacePtr);
blackboardPtr->GetData("TargetZombie", zombieInfo);
const float dist2{ (zombieInfo.Location - interfacePtr->Agent_GetInfo().Position).MagnitudeSquared() };
return dist2 <= maxRange * maxRange;
}
bool SeePurgeZone(Blackboard* blackboardPtr) {
IExamInterface* interfacePtr{};
blackboardPtr->GetData("Interface", interfacePtr);