2025-10-05 02:40:59 +01:00
|
|
|
#include "game/npc.h"
|
|
|
|
|
#include "game/world.h"
|
|
|
|
|
#include "core/types.h"
|
2025-10-05 15:32:57 +01:00
|
|
|
#include "core/math.h"
|
2025-10-05 02:40:59 +01:00
|
|
|
|
2025-10-05 00:25:37 +01:00
|
|
|
void updateNPC(F32 delta, NPC *npc, World *world) {
|
|
|
|
|
switch (npc->mode) {
|
|
|
|
|
case NPC_ACTION_WAITING:
|
|
|
|
|
npc->waitTime+=delta;
|
|
|
|
|
if(npc->waitTime > npc->maxWaitTime) {
|
|
|
|
|
npc->mode = NPC_ACTION_WALKING;
|
2025-10-05 15:32:57 +01:00
|
|
|
// TODO change targets to poi's rather than just random nodes
|
2025-10-05 18:28:58 +01:00
|
|
|
// TODO choose either global POI's or use NPC custom poi if
|
|
|
|
|
// customPOI is true
|
2025-10-05 18:05:01 +01:00
|
|
|
do {
|
|
|
|
|
npc->targetNavNode = Random_U32(&world->random, 0, world->navMesh->nodeCount);
|
|
|
|
|
} while(npc->targetNavNode == npc->currentNavNode);
|
2025-10-05 00:25:37 +01:00
|
|
|
npc->path = Nav_Path(world->navMesh, npc->currentNavNode, npc->targetNavNode);
|
|
|
|
|
npc->walkTimer = 0;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case NPC_ACTION_WALKING:
|
|
|
|
|
npc->walkTimer+=delta;
|
|
|
|
|
if(npc->walkTimer >= NPC_SPEED){
|
|
|
|
|
npc->walkTimer = 0;
|
|
|
|
|
if(npc->path.nodeCount == npc->pathIndex+1){
|
|
|
|
|
npc->mode = NPC_ACTION_WAITING;
|
2025-10-05 18:28:58 +01:00
|
|
|
npc->maxWaitTime = Random_F32(&world->random, 20, 140);
|
2025-10-05 00:25:37 +01:00
|
|
|
npc->waitTime = 0;
|
2025-10-05 16:49:18 +01:00
|
|
|
npc->currentNavNode = npc->targetNavNode;
|
2025-10-05 00:25:37 +01:00
|
|
|
npc->pathIndex = 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
npc->currentNavNode = npc->path.indexes[npc->pathIndex];
|
2025-10-05 16:49:18 +01:00
|
|
|
npc->pathIndex+=1;
|
2025-10-05 00:25:37 +01:00
|
|
|
}
|
2025-10-05 02:40:59 +01:00
|
|
|
NavNode cNav = world->navMesh->nodes[npc->currentNavNode];
|
2025-10-05 16:49:18 +01:00
|
|
|
NavNode tNav = world->navMesh->nodes[npc->path.indexes[npc->pathIndex]];
|
2025-10-05 00:25:37 +01:00
|
|
|
npc->collision.pos.x = cNav.pos.x * (1 - npc->walkTimer/NPC_SPEED) + tNav.pos.x * npc->walkTimer/NPC_SPEED;
|
|
|
|
|
npc->collision.pos.y = cNav.pos.y * (1 - npc->walkTimer/NPC_SPEED) + tNav.pos.y * npc->walkTimer/NPC_SPEED;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|