Add chase/evade behaviour

This commit is contained in:
2024-02-13 18:27:53 +01:00
parent e6ddafd3e2
commit 24abf94faa
8 changed files with 189 additions and 59 deletions

View File

@@ -259,25 +259,52 @@ bool init(void *userData) {
});
game->pools.btNode = bzObjectPoolCreate(&(BzObjectPoolDesc) {
.objectSize = bzBTGetNodeSize(),
.objectsPerPage = 64
.objectsPerPage = 40
});
game->pools.btNodeState = bzObjectPoolCreate(&(BzObjectPoolDesc) {
.objectSize = bzBTGetNodeStateSize(),
.objectsPerPage = 1024,
});
BzObjectPool *nodePool = game->pools.btNode;
// moveTo
// unit (aggressive)
{
BzBTNode *root = NULL;
BzBTNode *node = NULL;
root = bzBTMakeRoot(nodePool);
game->BTs.moveTo = root;
game->BTs.unit = root;
// Just a single action for now
BzBTNode *seq = bzBTCompSequence(nodePool, root);
node = bzBTAction(nodePool, seq, (BzBTActionFn) aiMoveTo);
BzBTNode *sel = bzBTCompSelector(nodePool, root);
BzBTNode *attackSeq = bzBTCompSequence(nodePool, sel);
{
node = bzBTAction(nodePool, attackSeq, (BzBTActionFn) aiIsEnemyNearby);
bzBTNodeSetName(node, "isEnemyNearby");
node = bzBTAction(nodePool, attackSeq, (BzBTActionFn) aiAttackEnemy);
bzBTNodeSetName(node, "attackEnemy");
}
node = bzBTAction(nodePool, sel, (BzBTActionFn) aiMoveTo);
bzBTNodeSetName(node, "moveTo");
bzBTDecorDelay(nodePool, seq, 6.0f);
bzBTDecorDelay(nodePool, sel, 2.0f);
}
// Unit (evasive)
{
BzBTNode *root = NULL;
BzBTNode *node = NULL;
root = bzBTMakeRoot(nodePool);
game->BTs.unitEvasive = root;
BzBTNode *sel = bzBTCompSelector(nodePool, root);
BzBTNode *evadeSeq = bzBTCompSequence(nodePool, sel);
{
node = bzBTAction(nodePool, evadeSeq, (BzBTActionFn) aiIsEnemyNearby);
bzBTNodeSetName(node, "isEnemyNearby");
node = bzBTAction(nodePool, evadeSeq, (BzBTActionFn) aiEvadeEnemy);
bzBTNodeSetName(node, "evadeEnemy");
}
node = bzBTAction(nodePool, sel, (BzBTActionFn) aiMoveTo);
bzBTNodeSetName(node, "moveTo");
bzBTDecorDelay(nodePool, sel, 2.0f);
}
// evade
BzBTNode *evade = NULL;
@@ -290,18 +317,16 @@ bool init(void *userData) {
node = bzBTAction(nodePool, evadeSeq, (BzBTActionFn) aiIsEnemyNearby);
bzBTNodeSetName(node, "enemyNearby");
node = bzBTAction(nodePool, evadeSeq, (BzBTActionFn) aiEvadeTarget);
node = bzBTAction(nodePool, evadeSeq, (BzBTActionFn) aiEvadeEnemy);
bzBTNodeSetName(node, "evadeTarget");
}
}
// worker harvest
{
BzBTNode *root = NULL;
BzBTNode *node = NULL;
root = bzBTMakeRoot(nodePool);
game->BTs.workerHarvest = root;
game->BTs.worker = root;
BzBTNode *pSel = bzBTCompPSelector(nodePool, root);
bzBTSubTree(evade, pSel);