Fix and integrate BT
This commit is contained in:
90
game/main.c
90
game/main.c
@@ -12,8 +12,6 @@
|
||||
#include "map_layers.h"
|
||||
#include "buildings.h"
|
||||
#include "ui_widgets.h"
|
||||
#include "unit_ai.h"
|
||||
#include "unit_actions.h"
|
||||
|
||||
#include "pathfinding.h"
|
||||
#include "sounds.h"
|
||||
@@ -215,10 +213,74 @@ bool init(void *userData) {
|
||||
.objectSize = sizeof(PathData),
|
||||
.objectsPerPage = 512
|
||||
});
|
||||
game->pools.actions = bzObjectPoolCreate(&(BzObjectPoolDesc) {
|
||||
.objectSize = sizeof(Action),
|
||||
game->pools.btNode = bzObjectPoolCreate(&(BzObjectPoolDesc) {
|
||||
.objectSize = bzBTGetNodeSize(),
|
||||
.objectsPerPage = 64
|
||||
});
|
||||
game->pools.btNodeState = bzObjectPoolCreate(&(BzObjectPoolDesc) {
|
||||
.objectSize = bzBTGetNodeStateSize(),
|
||||
.objectsPerPage = 1024,
|
||||
});
|
||||
BzObjectPool *nodePool = game->pools.btNode;
|
||||
// moveTo
|
||||
{
|
||||
BzBTNode *root = NULL;
|
||||
BzBTNode *node = NULL;
|
||||
root = bzBTMakeRoot(nodePool);
|
||||
game->BTs.moveTo = root;
|
||||
|
||||
// Just a single action for now
|
||||
node = bzBTAction(nodePool, root, (BzBTActionFn) aiMoveTo);
|
||||
bzBTNodeSetName(node, "moveTo");
|
||||
}
|
||||
// worker harvest
|
||||
{
|
||||
BzBTNode *root = NULL;
|
||||
BzBTNode *node = NULL;
|
||||
root = bzBTMakeRoot(nodePool);
|
||||
game->BTs.workerHarvest = root;
|
||||
|
||||
//node = bzBTDecorUntilFail(nodePool, root);
|
||||
|
||||
BzBTNode *collectSeq = bzBTCompSequence(nodePool, root, false);
|
||||
|
||||
BzBTNode *untilFail = bzBTDecorUntilFail(nodePool, collectSeq);
|
||||
{
|
||||
BzBTNode *untilSeq = bzBTCompSequence(nodePool, untilFail, false);
|
||||
node = bzBTAction(nodePool, untilSeq, (BzBTActionFn) aiFindNextHarvestable);
|
||||
bzBTNodeSetName(node, "findNextHarvestable");
|
||||
node = bzBTAction(nodePool, untilSeq, (BzBTActionFn) aiMoveTo);
|
||||
bzBTNodeSetName(node, "moveTo");
|
||||
node = bzBTAction(nodePool, untilSeq, (BzBTActionFn) aiResetElapsed);
|
||||
bzBTNodeSetName(node, "resetElapsed");
|
||||
node = bzBTAction(nodePool, untilSeq, (BzBTActionFn) aiHarvestRes);
|
||||
bzBTNodeSetName(node, "harvestRes");
|
||||
node = bzBTDecorInvert(nodePool, untilSeq);
|
||||
node = bzBTAction(nodePool, node, (BzBTActionFn) aiCarryCapacityFull);
|
||||
bzBTNodeSetName(node, "carryCapacityFull");
|
||||
}
|
||||
node = bzBTDecorInvert(nodePool, collectSeq);
|
||||
node = bzBTAction(nodePool, node, (BzBTActionFn) aiCarryCapacityEmpty);
|
||||
bzBTNodeSetName(node, "carryCapacityEmpty");
|
||||
|
||||
node = bzBTAction(nodePool, collectSeq, (BzBTActionFn) aiFindNearestStorage);
|
||||
bzBTNodeSetName(node, "findNearestStorage");
|
||||
node = bzBTAction(nodePool, collectSeq, (BzBTActionFn) aiMoveTo);
|
||||
bzBTNodeSetName(node, "moveTo");
|
||||
node = bzBTAction(nodePool, collectSeq, (BzBTActionFn) aiResetElapsed);
|
||||
bzBTNodeSetName(node, "resetElapsed");
|
||||
node = bzBTAction(nodePool, collectSeq, (BzBTActionFn) aiDepositRes);
|
||||
bzBTNodeSetName(node, "depositRes");
|
||||
node = bzBTDecorDelay(nodePool, collectSeq, 1.0f);
|
||||
|
||||
|
||||
//node = bzBTAction(nodePool, collectSeq, NULL);
|
||||
//bzBTNodeSetName(node, "harvest");
|
||||
//node = bzBTAction(nodePool, collectSeq, NULL);
|
||||
//bzBTNodeSetName(node, "moveTo");
|
||||
//node = bzBTAction(nodePool, collectSeq, NULL);
|
||||
//bzBTNodeSetName(node, "deposit");
|
||||
}
|
||||
|
||||
|
||||
game->frameDuration = 0.16f;
|
||||
@@ -273,7 +335,8 @@ void deinit(void *userData) {
|
||||
|
||||
bzStackAllocDestroy(&game->stackAlloc);
|
||||
bzObjectPoolDestroy(game->pools.pathData);
|
||||
bzObjectPoolDestroy(game->pools.actions);
|
||||
bzObjectPoolDestroy(game->pools.btNode);
|
||||
bzObjectPoolDestroy(game->pools.btNodeState);
|
||||
|
||||
bzArrayDestroy(game->drawData);
|
||||
|
||||
@@ -660,6 +723,14 @@ void igInspectWindow(ecs_entity_t entity, bool *open) {
|
||||
igTagCheckbox("Workable", ECS, entity, Workable);
|
||||
igTagCheckbox("Attackable", ECS, entity, Attackable);
|
||||
}
|
||||
if (ecs_has(ECS, entity, BzBTState) &&
|
||||
igCollapsingHeader_TreeNodeFlags("BehaviourTree", 0)) {
|
||||
const BzBTState *state = ecs_get(ECS, entity, BzBTState);
|
||||
if (state->root)
|
||||
igVisualizeBTState(state->root, state->_first, true, false, 0);
|
||||
else
|
||||
igTextColored((ImVec4) {1, 0, 0, 1}, "NONE");
|
||||
}
|
||||
igInspectComp("Resource", entity, ecs_id(Resource), igResource);
|
||||
igInspectComp("Owner", entity, ecs_id(Owner), igOwner);
|
||||
igInspectComp("SpatialGridID", entity, ecs_id(SpatialGridID), igSpatialGridID);
|
||||
@@ -675,8 +746,8 @@ void igInspectWindow(ecs_entity_t entity, bool *open) {
|
||||
igInspectComp("Easing", entity, ecs_id(Easing), igEasing);
|
||||
igInspectComp("Arms", entity, ecs_id(Arms), igArms);
|
||||
igInspectComp("Arm", entity, ecs_id(Arm), igArm);
|
||||
igInspectComp("UnitAction", entity, ecs_id(UnitAction), igUnitAction);
|
||||
igInspectComp("UnitAI", entity, ecs_id(UnitAI), igUnitAI);
|
||||
igInspectComp("BzBTState", entity, ecs_id(BzBTState), igBzBTState);
|
||||
igInspectComp("AIBlackboard", entity, ecs_id(AIBlackboard), igAIBlackboard);
|
||||
igInspectComp("Worker", entity, ecs_id(Worker), igWorker);
|
||||
igInspectComp("Unit", entity, ecs_id(Unit), igUnit);
|
||||
}
|
||||
@@ -691,8 +762,9 @@ void imguiRender(float dt, void *userData) {
|
||||
|
||||
igSetNextWindowSize((ImVec2){300, 400}, ImGuiCond_FirstUseEver);
|
||||
igBegin("Debug Menu", NULL, 0);
|
||||
igText("PathData pool available: %llu", bzObjectPoolGetNumFree(game->pools.pathData));
|
||||
igText("Action pool available: %llu", bzObjectPoolGetNumFree(game->pools.actions));
|
||||
igText("PathData pool available: %llu", bzObjectPoolGetNumFree(game->pools.pathData));
|
||||
igText("BTNode pool available: %llu", bzObjectPoolGetNumFree(game->pools.btNode));
|
||||
igText("BTNodeState pool available: %llu", bzObjectPoolGetNumFree(game->pools.btNodeState));
|
||||
const char *inputState = "NONE";
|
||||
switch (input->state) {
|
||||
case INPUT_NONE:
|
||||
|
||||
Reference in New Issue
Block a user