diff options
Diffstat (limited to 'src/level.cpp')
| -rw-r--r-- | src/level.cpp | 75 |
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); } |
