#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].levelHandle == 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"); if (lvl->bkt == nullptr) { lvl->bkt = Pke_BeginTransientBucket(); } lvl->levelHandle = 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->levelHandle; } 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].levelHandle != LevelHandle_MAX) { if (strcmp(safeName, LEVELS[i].name)) { return LEVELS[i].levelHandle; } } } return LevelHandle_MAX; } 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; ECS_MarkForRemoval(lvl); for (long i = 0; i < lvl->cameras.next; ++i) { PkeCamera_Destroy(lvl->cameras.data[i]); } PkeArray_HardReset(&lvl->cameras); Pke_ResetBucket(lvl->bkt); lvl->levelHandle = LevelHandle_MAX; }