summaryrefslogtreecommitdiff
path: root/src/level.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/level.cpp')
-rw-r--r--src/level.cpp75
1 files changed, 65 insertions, 10 deletions
diff --git a/src/level.cpp b/src/level.cpp
index 15517ac..120ef57 100644
--- a/src/level.cpp
+++ b/src/level.cpp
@@ -3,6 +3,7 @@
#include "ecs.hpp"
#include "pk.h"
+#include "scene.hpp"
struct level_mstr {
pk_membucket *bkt;
@@ -29,15 +30,25 @@ pke_level *pke_level_Get_Inner(LevelHandle handle) {
pke_level *pke_level_create(const char *levelName, pk_uuid level_uuid, pk_uuid ev_mgr_uuid) {
NULL_CHAR_ARR(safe_name, LEVEL_NAME_MAX_LEN + 1);
+ pke_level *lvl;
+ bool valid;
size_t len = strlen(levelName);
size_t start = len <= (LEVEL_NAME_MAX_LEN - 1) ? 0 : len - (LEVEL_NAME_MAX_LEN - 1);
sprintf(safe_name, pke_level_name_printf_format, levelName + start);
- pke_level *lvl = pke_level_get_by_name(levelName);
- if (lvl != nullptr) {
- fprintf(stderr, "[pke_level_Create] Failed to create new level: name already exists.");
- return nullptr;
+ /* 2025-09-05 JCB
+ * There used to be logic here enforcing names unique level names.
+ * I'm replacing it with a uuid check that ignores pk_uuid_zed
+ */
+ pk_iter_t<pke_level> it{};
+ valid = level_uuid != pk_uuid_zed && pk_bkt_arr_iter_begin(&level_mstr.bc, &it);
+ while (valid == true) {
+ if (it->uuid == level_uuid) {
+ fprintf(stderr, "[pke_level_Create] Failed to create new level: uuid already exists.");
+ return nullptr;
+ }
+ valid = pk_bkt_arr_iter_increment(&level_mstr.bc, &it);
}
LevelHandle level_handle { pk_bkt_arr_new_handle(&level_mstr.bc) };
@@ -50,6 +61,7 @@ pke_level *pke_level_create(const char *levelName, pk_uuid level_uuid, pk_uuid e
new (lvl) pke_level{};
lvl->uuid = level_uuid;
ECS_CreateEntity(lvl);
+ lvl->levelHandle = level_handle;
(void)ev_mgr_uuid;
// ECS_CreateEvManager(lvl, ev_mgr_uuid); // TODO
@@ -86,10 +98,53 @@ struct pk_bkt_arr *pke_level_get_levels() {
return &level_mstr.bc;
}
-void pke_level_remove(LevelHandle handle) {
- pke_level *lvl = &level_mstr.bc[handle];
- assert(lvl == nullptr && "Failed to find level to remove by requested LevelHandle");
- ECS_MarkForRemoval(lvl);
- pk_mem_bucket_destroy(lvl->bkt);
- pk_bkt_arr_free_handle(&level_mstr.bc, handle);
+void pke_level_teardown(pke_level *level) {
+ uint32_t u;
+ assert(level != nullptr);
+ if (level->pke_cb_teardown.func != nullptr) {
+ level->pke_cb_teardown.func();
+ }
+ ECS_MarkForRemoval(level);
+ for (u = 0; u < level->scene_instances.next; ++u) {
+ pke_scene_remove(level->scene_instances[u].scene_handle);
+ }
+ for (u = 0; u < level->cameras.next; ++u) {
+ PkeCamera_Destroy(level->cameras[u]->camHandle);
+ }
+ for (u = 0; u < level->input_handles.next; ++u) {
+ pke_input_deactivate_set(level->input_handles[u]);
+ pke_input_unregister_set(level->input_handles[u]);
+ }
+ for (u = 0; u < level->root_ui_boxes.next; ++u) {
+ ECS_MarkForRemoval(level->root_ui_boxes[u]);
+ }
+ if (level->file_path.reserved > 0) {
+ pk_delete_arr<char>(level->file_path.val, level->file_path.reserved);
+ }
+ if (level->bkt != nullptr) {
+ pk_mem_bucket_destroy(level->bkt);
+ }
+ pk_arr_reset(&level->scene_instances);
+ pk_arr_reset(&level->cameras);
+ pk_arr_reset(&level->root_ui_boxes);
+ pk_arr_reset(&level->input_handles);
+ pk_bkt_arr_free_handle(&level_mstr.bc, level->levelHandle);
+}
+
+void pke_level_register_camera(pke_level *level, PkeCamera *camera) {
+ assert(level != nullptr);
+ assert(camera != nullptr);
+ pk_arr_append_t(&level->cameras, camera);
+}
+
+void pke_level_register_input_action_set(pke_level *level, pke_input_action_set_handle handle) {
+ assert(level != nullptr);
+ assert(handle != pke_input_action_set_handle_MAX);
+ pk_arr_append_t(&level->input_handles, handle);
+}
+
+void pke_level_register_root_ui_box(pke_level *level, pke_ui_box *box) {
+ assert(level != nullptr);
+ assert(box != nullptr);
+ pk_arr_append_t(&level->root_ui_boxes, box);
}