Improve harvest target assigment (asign closest first)

This commit is contained in:
2024-02-13 14:40:44 +01:00
parent 8d7a32d941
commit d8c7bb7074

View File

@@ -96,6 +96,19 @@ static int entityPosPairCmpZero(const void *lhsData, const void *rhsData) {
return vec2CmpZero(&lhs->pos, &rhs->pos);
}
typedef struct EntityFloatPair {
ecs_entity_t entity;
f32 value;
} EntityFloatPair;
static int entityFloatPairCmp(const void *lhsData, const void *rhsData) {
const EntityFloatPair *lhs = lhsData;
const EntityFloatPair *rhs = rhsData;
if (lhs->value < rhs->value) return -1;
if (lhs->value > rhs->value) return 1;
return 0;
}
void inputUnitAction(Game *game, InputState *input) {
ecs_query_t *query = input->queries.selected;
BzTileMap *map = &game->map;
@@ -127,35 +140,51 @@ void inputUnitAction(Game *game, InputState *input) {
BzSpatialGridIter gridIt = bzSpatialGridIter(game->entityGrid,
mPos.x - hRadius, mPos.y - hRadius,
mPos.x + hRadius, mPos.y + hRadius);
EntityFloatPair *harvestables = bzStackAlloc(&game->stackAlloc, 0);
i32 numHarvestables = 0;
while (bzSpatialGridQueryNext(&gridIt)) {
ecs_entity_t harvestEntity = *(ecs_entity_t *) gridIt.data;
if (!ecs_has(ECS, harvestEntity, Harvestable))
continue;
if (!ecs_has(ECS, harvestEntity, Resource))
continue;
if (!ecs_has(ECS, harvestEntity, Position))
continue;
if (!ecs_has(ECS, harvestEntity, HitBox))
continue;
Resource res = *ecs_get(ECS, harvestEntity, Resource);
if (res.type != resource.type)
continue;
Position harvestPos = *ecs_get(ECS, harvestEntity, Position);
HitBox harvestHB = *ecs_get(ECS, harvestEntity, HitBox);
harvestPos = entityGetCenter(harvestPos, harvestHB);
f32 dst = Vector2Distance(harvestPos, mPos);
harvestables[numHarvestables++] = (EntityFloatPair) {
harvestEntity, dst
};
}
qsort(harvestables, numHarvestables, sizeof(*harvestables), entityFloatPairCmp);
i32 idxHarvestable = 0;
ecs_defer_begin(ECS);
ecs_iter_t it = ecs_query_iter(ECS, query);
while (ecs_query_next(&it)) {
for (i32 i = 0; i < it.count; i++) {
if (idxHarvestable >= numHarvestables)
break;
ecs_entity_t entity = it.entities[i];
bool hasNext = false;
ecs_entity_t harvestEntity = 0;
do {
hasNext = bzSpatialGridQueryNext(&gridIt);
if (!hasNext) break;
harvestEntity = *(ecs_entity_t *) gridIt.data;
if (!ecs_has(ECS, harvestEntity, Resource))
continue;
const Resource *res = ecs_get(ECS, harvestEntity, Resource);
if (res->type != resource.type)
continue;
if (!ecs_has(ECS, harvestEntity, Harvestable))
continue;
Harvestable *harvestable = ecs_get_mut(ECS, harvestEntity, Harvestable);
EntityFloatPair harvestEntity = {0, 0};
while (idxHarvestable < numHarvestables) {
harvestEntity = harvestables[idxHarvestable++];
Harvestable *harvestable = ecs_get_mut(ECS, harvestEntity.entity, Harvestable);
if (harvestable->harvestCount >= harvestable->harvestLimit)
continue;
harvestable->harvestCount++;
break;
} while (hasNext);
if (!hasNext) break;
Position target = *ecs_get(ECS, harvestEntity, Position);
HitBox targetHB = *ecs_get(ECS, harvestEntity, HitBox);
}
Position target = *ecs_get(ECS, harvestEntity.entity, Position);
HitBox targetHB = *ecs_get(ECS, harvestEntity.entity, HitBox);
target = entityGetCenter(target, targetHB);
f32 proximity = 4.0f;
@@ -166,7 +195,7 @@ void inputUnitAction(Game *game, InputState *input) {
setAIBehaviour(entity, game->BTs.workerHarvest, &(AIBlackboard) {
.as.worker = {
.harvestType = resource.type,
.harvestTarget = harvestEntity,
.harvestTarget = harvestEntity.entity,
.harvestPos = target,
},
.proximity = proximity,