summaryrefslogtreecommitdiff
path: root/src/level.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-12-13 15:53:52 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-12-23 11:41:03 -0500
commit064e9ba16e390b13566d0007ef367dcb1adacc8d (patch)
tree359be3c8de88da8544646bfc9a84a8c8b3f383cd /src/level.cpp
parenta527dd1b773f14df140d3ac6a167339d7dc39e33 (diff)
checkpoint - add PkeLevel - editor removes on scene load
Diffstat (limited to 'src/level.cpp')
-rw-r--r--src/level.cpp91
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);
+}