From 8c889690e8a722357a95a2816b5a3f526d46028c Mon Sep 17 00:00:00 2001 From: En Yi Date: Thu, 17 Aug 2023 21:51:11 +0800 Subject: [PATCH] Add null checks when creating new entity Also, fix player spawn to reuse the player --- scenes/editor_scene.c | 2 ++ scenes/engine/EC/mempool.c | 1 + scenes/game_systems.c | 19 ++++++++++--------- scenes/items_ent.c | 12 ++++++++++-- scenes/player_ent.c | 4 ++++ 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index e177a75..1f86289 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -528,6 +528,7 @@ static void spawn_crate(Scene_t* scene, unsigned int tile_idx, bool metal, Conta { LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); Entity_t* p_crate = create_crate(&scene->ent_manager, &scene->engine->assets, metal, item); + if (p_crate == NULL) return; CTransform_t* p_ctransform = get_component(p_crate, CTRANSFORM_COMP_T); p_ctransform->position.x = (tile_idx % data->tilemap.width) * TILE_SIZE; @@ -539,6 +540,7 @@ static void spawn_boulder(Scene_t* scene, unsigned int tile_idx) { LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); Entity_t* p_boulder = create_boulder(&scene->ent_manager, &scene->engine->assets); + if (p_boulder == NULL) return; CTransform_t* p_ctransform = get_component(p_boulder, CTRANSFORM_COMP_T); p_ctransform->position.x = (tile_idx % data->tilemap.width) * TILE_SIZE; diff --git a/scenes/engine/EC/mempool.c b/scenes/engine/EC/mempool.c index b4faaa1..8a03845 100644 --- a/scenes/engine/EC/mempool.c +++ b/scenes/engine/EC/mempool.c @@ -217,6 +217,7 @@ void free_component_to_mempool(ComponentEnum_t comp_type, unsigned long idx) void print_mempool_stats(char* buffer) { + buffer += sprintf(buffer, "Entity free: %u\n", ent_mempool.free_list.count); for (size_t i = 0; i < N_COMPONENTS; ++i) { buffer += sprintf( diff --git a/scenes/game_systems.c b/scenes/game_systems.c index c8673cf..1e91dc6 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -202,7 +202,6 @@ void player_respawn_system(Scene_t* scene) LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); TileGrid_t tilemap = data->tilemap; Entity_t* p_player; - uint8_t to_respawn = 0; // Cannot create player while looping though the players // So have to create outside of the loop sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], p_player) @@ -210,17 +209,19 @@ void player_respawn_system(Scene_t* scene) if (!p_player->m_alive) { CTransform_t* p_ct = get_component(p_player, CTRANSFORM_COMP_T); - remove_entity_from_tilemap(&scene->ent_manager, &tilemap, p_player); Entity_t* ent = create_dead_player(&scene->ent_manager, &scene->engine->assets); - CTransform_t* new_ct = get_component(ent, CTRANSFORM_COMP_T); - memcpy(&new_ct->position, &p_ct->position, sizeof(p_ct->position)); - to_respawn++; + if (ent != NULL) + { + CTransform_t* new_ct = get_component(ent, CTRANSFORM_COMP_T); + memcpy(&new_ct->position, &p_ct->position, sizeof(p_ct->position)); + } + p_player->m_alive = true; + memset(&p_ct->position, 0, sizeof(p_ct->position)); + memset(&p_ct->velocity, 0, sizeof(p_ct->velocity)); + memset(&p_ct->accel, 0, sizeof(p_ct->accel)); + } } - if (to_respawn > 0) - { - create_player(&scene->ent_manager, &scene->engine->assets); - } } void player_dir_reset_system(Scene_t* scene) diff --git a/scenes/items_ent.c b/scenes/items_ent.c index be9f166..e9e31cc 100644 --- a/scenes/items_ent.c +++ b/scenes/items_ent.c @@ -34,8 +34,9 @@ bool init_item_creation(Assets_t* assets) Entity_t* create_crate(EntityManager_t* ent_manager, Assets_t* assets, bool metal, ContainerItem_t item) { Entity_t* p_crate = add_entity(ent_manager, CRATES_ENT_TAG); - CBBox_t* p_bbox = add_component(p_crate, CBBOX_COMP_T); + if (p_crate == NULL) return NULL; + CBBox_t* p_bbox = add_component(p_crate, CBBOX_COMP_T); set_bbox(p_bbox, TILE_SIZE, TILE_SIZE); p_bbox->solid = true; p_bbox->fragile = !metal; @@ -75,8 +76,9 @@ Entity_t* create_crate(EntityManager_t* ent_manager, Assets_t* assets, bool meta Entity_t* create_boulder(EntityManager_t* ent_manager, Assets_t* assets) { Entity_t* p_boulder = add_entity(ent_manager, BOULDER_ENT_TAG); - CBBox_t* p_bbox = add_component(p_boulder, CBBOX_COMP_T); + if (p_boulder == NULL) return NULL; + CBBox_t* p_bbox = add_component(p_boulder, CBBOX_COMP_T); set_bbox(p_bbox, TILE_SIZE, TILE_SIZE); p_bbox->solid = true; p_bbox->fragile = false; @@ -99,6 +101,8 @@ Entity_t* create_boulder(EntityManager_t* ent_manager, Assets_t* assets) Entity_t* create_arrow(EntityManager_t* ent_manager, Assets_t* assets, uint8_t dir) { Entity_t* p_arrow = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG); + if (p_arrow == NULL) return NULL; + add_component(p_arrow, CTILECOORD_COMP_T); CHitBoxes_t* p_hitbox = add_component(p_arrow, CHITBOXES_T); p_hitbox->n_boxes = 1; @@ -143,6 +147,8 @@ Entity_t* create_arrow(EntityManager_t* ent_manager, Assets_t* assets, uint8_t d Entity_t* create_bomb(EntityManager_t* ent_manager, Assets_t* assets, Vector2 launch_dir) { Entity_t* p_bomb = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG); + if (p_bomb == NULL) return NULL; + add_component(p_bomb, CTILECOORD_COMP_T); add_component(p_bomb, CMOVEMENTSTATE_T); CHitBoxes_t* p_hitbox = add_component(p_bomb, CHITBOXES_T); @@ -173,6 +179,8 @@ Entity_t* create_bomb(EntityManager_t* ent_manager, Assets_t* assets, Vector2 la Entity_t* create_explosion(EntityManager_t* ent_manager, Assets_t* assets) { Entity_t* p_explosion = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG); + if (p_explosion == NULL) return NULL; + add_component(p_explosion, CTILECOORD_COMP_T); CHitBoxes_t* p_hitbox = add_component(p_explosion, CHITBOXES_T); p_hitbox->n_boxes = 1; diff --git a/scenes/player_ent.c b/scenes/player_ent.c index 746c5c1..7b5c590 100644 --- a/scenes/player_ent.c +++ b/scenes/player_ent.c @@ -58,6 +58,8 @@ static unsigned int player_sprite_transition_func(Entity_t* ent) Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets) { Entity_t* p_ent = add_entity(ent_manager, PLAYER_ENT_TAG); + if (p_ent == NULL) return NULL; + CBBox_t* p_bbox = add_component(p_ent, CBBOX_COMP_T); set_bbox(p_bbox, PLAYER_WIDTH, PLAYER_HEIGHT); @@ -98,6 +100,8 @@ Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets) Entity_t* create_dead_player(EntityManager_t* ent_manager, Assets_t* assets) { Entity_t* p_ent = add_entity(ent_manager, NO_ENT_TAG); + if (p_ent == NULL) return NULL; + CTransform_t* p_ct = add_component(p_ent, CTRANSFORM_COMP_T); p_ct->active = true; p_ct->shape_factor = (Vector2){1, 1};