From add592afd2985b379e39d64cc05ca850dc68583e Mon Sep 17 00:00:00 2001 From: En Yi Date: Sat, 24 Aug 2024 12:43:49 +0800 Subject: [PATCH] Refactor out entity removal function This allows a singular entity removal method for the game --- scenes/game_systems.c | 26 ++++++++++---------------- scenes/scene_impl.h | 1 + scenes/scene_systems.c | 35 +++++++++++++++++++++++++---------- 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 825ecc9..1e50abd 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -1,8 +1,12 @@ #include "game_systems.h" -#include "particle_sys.h" + +#include "scene_impl.h" #include "ent_impl.h" + +#include "particle_sys.h" #include "AABB.h" #include "EC.h" + #include "constants.h" #include @@ -48,8 +52,8 @@ static inline void destroy_tile(LevelSceneData_t* lvl_data, unsigned int tile_id .spr = spr, .config = get_emitter_conf(&scene->engine->assets, "pe_burst"), .position = { - .x = tile_idx % tilemap.width * tilemap.tile_size + tilemap.tile_size / 2, - .y = tile_idx / tilemap.width * tilemap.tile_size + tilemap.tile_size / 2, + .x = tile_idx % tilemap.width * tilemap.tile_size + (tilemap.tile_size >> 1), + .y = tile_idx / tilemap.width * tilemap.tile_size + (tilemap.tile_size >> 1), }, .n_particles = 5, .user_data = CONTAINER_OF(lvl_data, LevelScene_t, data), @@ -71,6 +75,7 @@ static bool check_collision_and_move( SolidType_t other_solid ) { + // TODO: Need some NULL checks to be more robust CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T); CBBox_t* p_bbox = get_component(ent, CBBOX_COMP_T); Vector2 overlap = {0,0}; @@ -149,24 +154,14 @@ collision_end: return overlap_mode > 0; } -void destroy_entity(Scene_t* scene, TileGrid_t* tilemap, Entity_t* p_ent) +static void destroy_entity(Scene_t* scene, TileGrid_t* tilemap, Entity_t* p_ent) { - /* Use the helper function to remove any entity - * This is because some components may have deinit steps - * This function will also take care of the tilemap collision handling - * */ - Vector2 half_size = {0,0}; CBBox_t* p_bbox = get_component(p_ent, CBBOX_COMP_T); if (p_bbox != NULL) { half_size = p_bbox->half_size; } - CEmitter_t* p_emitter = get_component(p_ent, CEMITTER_T); - if (p_emitter != NULL) - { - unload_emitter_handle(&scene->part_sys, p_emitter->handle); - } if (p_ent->m_tag == BOULDER_ENT_TAG) { @@ -236,7 +231,7 @@ void destroy_entity(Scene_t* scene, TileGrid_t* tilemap, Entity_t* p_ent) play_sfx(scene->engine, ARROW_DESTROY_SFX); } - remove_entity_from_tilemap(&scene->ent_manager, tilemap, p_ent); + clear_an_entity(scene, tilemap, p_ent); } void check_player_dead_system(Scene_t* scene) @@ -564,7 +559,6 @@ void player_crushing_system(Scene_t* scene) Entity_t* p_player; sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], p_player) { - // TODO: Use BBox for crushing check only if not noclip CBBox_t* p_bbox = get_component(p_player, CBBOX_COMP_T); uint8_t edges = check_bbox_edges( diff --git a/scenes/scene_impl.h b/scenes/scene_impl.h index e19f144..86a2f19 100644 --- a/scenes/scene_impl.h +++ b/scenes/scene_impl.h @@ -94,6 +94,7 @@ void free_game_scene(LevelScene_t* scene); void init_sandbox_scene(LevelScene_t* scene); void free_sandbox_scene(LevelScene_t* scene); void init_level_scene_data(LevelSceneData_t* data, uint32_t max_tiles, Tile_t* tiles, Rectangle view_zone); +void clear_an_entity(Scene_t* scene, TileGrid_t* tilemap, Entity_t* p_ent); void clear_all_game_entities(LevelScene_t* scene); void term_level_scene_data(LevelSceneData_t* data); void reload_level_tilemap(LevelScene_t* scene); diff --git a/scenes/scene_systems.c b/scenes/scene_systems.c index 11e7a06..e857518 100644 --- a/scenes/scene_systems.c +++ b/scenes/scene_systems.c @@ -53,22 +53,37 @@ void term_level_scene_data(LevelSceneData_t* data) } } +void clear_an_entity(Scene_t* scene, TileGrid_t* tilemap, Entity_t* p_ent) +{ + /* Use the helper function to remove any entity + * This is because some components may have deinit steps + * This function will also take care of the tilemap collision handling + * */ + + CEmitter_t* p_emitter = get_component(p_ent, CEMITTER_T); + if (p_emitter != NULL) + { + unload_emitter_handle(&scene->part_sys, p_emitter->handle); + } + if (get_component(p_ent, CWATERRUNNER_T)!= NULL) + { + free_water_runner(p_ent, &scene->ent_manager); + } + + remove_entity_from_tilemap(&scene->ent_manager, tilemap, p_ent); +} + void clear_all_game_entities(LevelScene_t* scene) { Entity_t* ent; sc_map_foreach_value(&scene->scene.ent_manager.entities, ent) { - CWaterRunner_t* p_crunner = get_component(ent, CWATERRUNNER_T); - if (p_crunner != NULL) - { - free_water_runner(ent, &scene->scene.ent_manager); - } - CEmitter_t* p_emitter = get_component(ent, CEMITTER_T); - if (p_emitter != NULL) - { - unload_emitter_handle(&scene->scene.part_sys, p_emitter->handle); - } + clear_an_entity(&scene->scene, &scene->data.tilemap, ent); } + + // This is unnecessary as the first pass should clear everything + // For now, leave it in. This is not expected to call all the time + // so not too bad clear_entity_manager(&scene->scene.ent_manager); for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++) {