Add interactions.

This commit is contained in:
2025-03-05 18:36:45 -06:00
parent 9556df490c
commit 150b67cc7a
4 changed files with 32 additions and 2 deletions

View File

@ -109,7 +109,27 @@ void entityMove(entity_t *ent, const facingdir_t dir) {
} }
} }
bool entityIsMoving(const entity_t *ent) { bool_t entityIsMoving(const entity_t *ent) {
assertNotNull(ent, "Entity cannot be NULL"); assertNotNull(ent, "Entity cannot be NULL");
return ent->subX != 0 || ent->subY != 0; return ent->subX != 0 || ent->subY != 0;
}
bool_t entityInteract(const entity_t *ent) {
assertNotNull(ent, "Entity cannot be NULL.");
assertTrue(ent->type == ENTITY_TYPE_PLAYER, "Entity should be player.");
if(entityIsMoving(ent)) return false;
uint8_t targetX = ent->x, targetY = ent->y;
facingDirAdd(ent->direction, &targetX, &targetY);
entity_t *target = overworldEntityGetAtPosition(targetX, targetY);
assertFalse(target == ent, "Cannot interact with self.");
if(target == NULL) return false;
assertTrue(target->type < ENTITY_TYPE_COUNT, "Invalid entity type.");
if(ENTITY_CALLBACKS[target->type].interact == NULL) return false;
ENTITY_CALLBACKS[target->type].interact(target);
return true;
} }

View File

@ -78,4 +78,12 @@ void entityMove(entity_t *entity, const facingdir_t dir);
* @param entity The entity to check. * @param entity The entity to check.
* @return TRUE if the entity is moving, FALSE otherwise. * @return TRUE if the entity is moving, FALSE otherwise.
*/ */
bool_t entityIsMoving(const entity_t *entity); bool_t entityIsMoving(const entity_t *entity);
/**
* Make this entity attempt to interact with the world.
*
* @param entity The entity that is doing the interaction.
* @return TRUE if an entity was interacted with, FALSE otherwise.
*/
bool_t entityInteract(const entity_t *entity);

View File

@ -14,4 +14,5 @@ void npcUpdate(entity_t *ent) {
} }
void npcInteract(entity_t *ent) { void npcInteract(entity_t *ent) {
printf("Interact\n");
} }

View File

@ -27,6 +27,7 @@ void playerUpdate(entity_t *ent) {
} else if(inputIsDown(INPUT_DOWN)) { } else if(inputIsDown(INPUT_DOWN)) {
entityMove(ent, FACING_DIRECTION_SOUTH); entityMove(ent, FACING_DIRECTION_SOUTH);
} else if(inputWasPressed(INPUT_ACCEPT)) { } else if(inputWasPressed(INPUT_ACCEPT)) {
entityInteract(ent);
} }
} }