From c6a4356d2b055311174085fe4991ccdba8eb3001 Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Fri, 9 Feb 2024 21:46:28 +0100 Subject: [PATCH] Remove bugs with ecs hooks --- game/systems/systems.c | 47 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/game/systems/systems.c b/game/systems/systems.c index 7da3de9..c152592 100644 --- a/game/systems/systems.c +++ b/game/systems/systems.c @@ -50,6 +50,13 @@ ECS_MOVE(SpatialGridID, dst, src, { *dst = *src; *src = 0; }) +void spatialIDRemoved(ecs_iter_t *it) { + Game *game = ecs_singleton_get_mut(ECS, Game); + SpatialGridID *spatialID = ecs_field(it, SpatialGridID, 1); + for (int i = 0; i < it->count; i++) { + bzSpatialGridRemove(game->entityGrid, spatialID[i]); + } +} ECS_DTOR(Path, path, { Game *game = ecs_singleton_get_mut(ECS, Game); BzObjectPool *pool = game->pools.pathData; @@ -89,16 +96,34 @@ ECS_MOVE(Building, dst, src, { *dst = *src; *src = (Building) {.type = 0}; }) +void buildingRemoved(ecs_iter_t *it) { + Game *game = ecs_singleton_get_mut(ECS, Game); + Building *building = ecs_field(it, Building, 1); + for (int i = 0; i < it->count; i++) { + Vec2i pos = building[i].pos; + Vec2i size = building[i].size; + bzTileMapSetCollisions(&game->map, false, COLL_LAYER_BUILDINGS, pos.x, pos.y, size.x, size.y); + } +} -ECS_DTOR(AttachedEntity, attacked, { - if (ecs_is_alive(ECS, attacked->entity)) - ecs_delete(ECS, attacked->entity); - attacked->entity = 0; +ECS_DTOR(AttachedEntity, attached, { + if (ecs_is_alive(ECS, attached->entity)) + ecs_delete(ECS, attached->entity); + attached->entity = 0; }) ECS_MOVE(AttachedEntity, dst, src, { *dst = *src; src->entity = 0; }) +void attachedRemoved(ecs_iter_t *it) { + AttachedEntity *attached = ecs_field(it, AttachedEntity , 1); + for (int i = 0; i < it->count; i++) { + const ecs_entity_t entity = attached[i].entity; + if (ecs_is_alive(ECS, entity)) + ecs_delete(ECS, entity); + } +} + void delayDeleteUpdate(ecs_iter_t *it) { DelayDelete *delay = ecs_field(it, DelayDelete, 1); @@ -108,28 +133,32 @@ void delayDeleteUpdate(ecs_iter_t *it) { for (i32 i = 0; i < it->count; i++) { delay[i].elapsed += dt; - if (delay[i].elapsed >= delay[i].time) + if (delay[i].elapsed >= delay[i].time) { ecs_delete(ECS, it->entities[i]); + } } } void setupSystems() { ecs_set_hooks(ECS, SpatialGridID, { .dtor = ecs_dtor(SpatialGridID), - .move_dtor = ecs_move(SpatialGridID) + .move_dtor = ecs_move(SpatialGridID), + .on_remove = spatialIDRemoved, }); ecs_set_hooks(ECS, Path, { .dtor = ecs_dtor(Path), .move = ecs_move(Path), - .on_remove = pathRemoved + .on_remove = pathRemoved, }); ecs_set_hooks(ECS, Building, { .dtor = ecs_dtor(Building), - .move_dtor = ecs_move(Building) + .move_dtor = ecs_move(Building), + .on_remove = buildingRemoved, }); ecs_set_hooks(ECS, AttachedEntity, { .dtor = ecs_dtor(AttachedEntity), - .move_dtor = ecs_move(AttachedEntity) + .move_dtor = ecs_move(AttachedEntity), + .on_remove = attachedRemoved, }); ECS_OBSERVER(ECS, entityPathRemove, EcsOnRemove, Path);