diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-13 15:53:52 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-23 11:41:03 -0500 |
| commit | 064e9ba16e390b13566d0007ef367dcb1adacc8d (patch) | |
| tree | 359be3c8de88da8544646bfc9a84a8c8b3f383cd /src/level.cpp | |
| parent | a527dd1b773f14df140d3ac6a167339d7dc39e33 (diff) | |
checkpoint - add PkeLevel - editor removes on scene load
Diffstat (limited to 'src/level.cpp')
| -rw-r--r-- | src/level.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/level.cpp b/src/level.cpp new file mode 100644 index 0000000..fcca5bd --- /dev/null +++ b/src/level.cpp @@ -0,0 +1,91 @@ + +#include "level.hpp" + +#include "camera.hpp" +#include "ecs.hpp" + +LevelHandle nextHandle = LevelHandle{0}; +long levelCount = 0; +constexpr long LEVEL_NAME_LENGTH = 16; +PkeLevel LEVELS[MAX_LEVEL_COUNT]; + +PkeLevel *PkeLevel_Get_Inner(LevelHandle handle) { + for (long i = 0; i < MAX_LEVEL_COUNT; ++i) { + if (LEVELS[i].handle == handle) { + return &LEVELS[i]; + } + } + return nullptr; +} + +LevelHandle PkeLevel_Create(const char *levelName) { + assert(levelCount < MAX_LEVEL_COUNT && "only MAX_LEVEL_COUNT levels can be loaded at once"); + levelCount += 1; + + PkeLevel *lvl = PkeLevel_Get_Inner(LevelHandle_MAX); + assert(lvl != nullptr && "max level count not reached, but failed to find a valid level slot"); + + lvl->bkt = Pke_BeginTransientBucket(); + lvl->handle = nextHandle; + ++nextHandle; + + auto len = strlen(levelName); + auto start = len <= (LEVEL_NAME_LENGTH - 1) ? 0 : len - (LEVEL_NAME_LENGTH - 1); + strncpy(lvl->name, levelName + start, LEVEL_NAME_LENGTH); + return lvl->handle; +} + +PkeLevel *PkeLevel_Get(LevelHandle handle) { + return PkeLevel_Get_Inner(handle); +} + +LevelHandle PkeLevel_GetHandle(const char *levelName) { + char safeName[LEVEL_NAME_LENGTH]; + auto len = strlen(levelName); + auto start = len <= (LEVEL_NAME_LENGTH - 1) ? 0 : len - (LEVEL_NAME_LENGTH - 1); + strncpy(safeName, levelName + start, LEVEL_NAME_LENGTH); + for (long i = 0; i < MAX_LEVEL_COUNT; ++i) { + if (LEVELS[i].handle != LevelHandle_MAX) { + if (strcmp(safeName, LEVELS[i].name)) { + return LEVELS[i].handle; + } + } + } + return LevelHandle_MAX; +} + +void PkeLevel_RegisterWrappingEntity(LevelHandle levelHandle, EntityHandle entityHandle) { + assert(levelHandle != LevelHandle_MAX); + assert(entityHandle != EntityHandle_MAX); + PkeLevel *lvl = PkeLevel_Get_Inner(levelHandle); + assert(lvl != nullptr && "Failed to find level by requested LevelHandle"); + PkeArray_Add(&lvl->wrappingEntities, entityHandle, lvl->bkt); +} + +void PkeLevel_RegisterCamera(LevelHandle levelHandle, CameraHandle cameraHandle) { + assert(levelHandle != LevelHandle_MAX); + assert(cameraHandle != CameraHandle_MAX); + PkeLevel *lvl = PkeLevel_Get_Inner(levelHandle); + assert(lvl != nullptr && "Failed to find level by requested LevelHandle"); + PkeArray_Add(&lvl->cameras, cameraHandle, lvl->bkt); +} + +void PkeLevel_Remove(LevelHandle handle) { + PkeLevel *lvl = PkeLevel_Get_Inner(handle); + assert(lvl != nullptr && "Failed to find level to remove by requested LevelHandle"); + levelCount -= 1; + for (long i = 0; i < lvl->wrappingEntities.next; ++i) { + ECS_MarkForRemoval(lvl->wrappingEntities.data[i]); + } + for (long i = 0; i < lvl->cameras.next; ++i) { + PkeCamera_Destroy(lvl->cameras.data[i]); + } + PkeArray_HardReset<EntityHandle>(&lvl->wrappingEntities); + PkeArray_HardReset<CameraHandle>(&lvl->cameras); + Pke_EndTransientBucket(lvl->bkt); + lvl->bkt = CAFE_BABE(MemBucket); + lvl->handle = LevelHandle_MAX; + lvl->wrappingEntities.next = 0; + lvl->wrappingEntities.reserved = 0; + lvl->wrappingEntities.data = CAFE_BABE(EntityHandle); +} |
