From 1ceacd2e62b6ffc804d033add3b787fa86ff88ac Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Wed, 15 Nov 2023 19:11:39 +0100 Subject: [PATCH] Add update method to entity map --- game/entity_map.c | 26 ++++++++++++++++++++++---- game/entity_map.h | 5 +++-- game/main.c | 2 +- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/game/entity_map.c b/game/entity_map.c index b55d541..ac23314 100644 --- a/game/entity_map.c +++ b/game/entity_map.c @@ -81,7 +81,7 @@ EntityMapEntry entityMapInsert(EntityMap *entityMap, ecs_entity_t entity, Positi entry.index = mapIndex; i32 entryIdx = bzArraySize(entityMap->entities); - entry.entryID = entryIdx; + entry.entryIdx = entryIdx; bzArrayPush(entityMap->entities, entry); bool wasInserted = true; @@ -90,6 +90,7 @@ EntityMapEntry entityMapInsert(EntityMap *entityMap, ecs_entity_t entity, Positi for (i32 x = mapIndex.minX; x <= mapIndex.maxX; x++) { wasInserted &= insertMapEntry(entityMap, entryIdx, x, y); if (!wasInserted) { + entityMapRemoveIdx(entityMap, entryIdx); return (EntityMapEntry) { .entity = 0, }; @@ -99,10 +100,27 @@ EntityMapEntry entityMapInsert(EntityMap *entityMap, ecs_entity_t entity, Positi return entry; } -void entityMapRemove(EntityMap *entityMap, EntityMapEntry entry) { - entityMapRemoveID(entityMap, entry.entryID); +EntityMapEntry entityMapUpdate(EntityMap *entityMap, EntityMapEntry entry, Position pos, Size size) { + EntityMapEntry check = bzArrayGet(entityMap->entities, entry.entity); + BZ_ASSERT(check.entity == entry.entity); + + EntityMapIndex mapIndex = calculateMapIndex(entityMap, pos, size); + if (entry.index.minX == mapIndex.minX && + entry.index.minY == mapIndex.minY && + entry.index.maxX == mapIndex.maxX && + entry.index.maxY == mapIndex.maxY) { + return entry; + } + + // TODO: Has room for optimization + entityMapRemoveIdx(entityMap, entry.entryIdx); + entityMapInsert(entityMap, entry.entity, pos, size); + } -void entityMapRemoveID(EntityMap *entityMap, i32 entryID) { +void entityMapRemove(EntityMap *entityMap, EntityMapEntry entry) { + entityMapRemoveIdx(entityMap, entry.entryIdx); +} +void entityMapRemoveIdx(EntityMap *entityMap, i32 entryID) { EntityMapEntry entry = bzArrayGet(entityMap->entities, entryID); EntityMapIndex index = entry.index; diff --git a/game/entity_map.h b/game/entity_map.h index a1d864f..48fc651 100644 --- a/game/entity_map.h +++ b/game/entity_map.h @@ -14,7 +14,7 @@ typedef struct EntityMapIndex { typedef struct EntityMapEntry { ecs_entity_t entity; i32 queryIdx; - i32 entryID; + i32 entryIdx; EntityMapIndex index; } EntityMapEntry; @@ -49,8 +49,9 @@ EntityMap entityMapCreate(const EntityMapDesc *desc); void entityMapDestroy(EntityMap *entityMap); EntityMapEntry entityMapInsert(EntityMap *entityMap, ecs_entity_t entity, Position pos, Size size); +EntityMapEntry entityMapUpdate(EntityMap *entityMap, EntityMapEntry entry, Position pos, Size size); void entityMapRemove(EntityMap *entityMap, EntityMapEntry entry); -void entityMapRemoveID(EntityMap *entityMap, i32 entryID); +void entityMapRemoveIdx(EntityMap *entityMap, i32 entryID); EntityMapIter entityMapQueryIter(EntityMap *entityMap, Position pos, Size size); bool entityMapQueryNext(EntityMapIter *it); diff --git a/game/main.c b/game/main.c index 5ffc151..6e61db2 100644 --- a/game/main.c +++ b/game/main.c @@ -97,7 +97,7 @@ bool init(void *userData) { .maxWidth=game->map.width * game->map.tileWidth, .maxHeight=game->map.height * game->map.tileHeight, .cellResolution=game->map.tileWidth, - .cellDepth=10 + .cellDepth=16 }); bzTileMapOverrideLayer(&game->map, LAYER_BUILDING_OWNER, initBuildingsLayer);