Refactor out entity removal function
This allows a singular entity removal method for the gamemain
parent
fb0f16d984
commit
add592afd2
|
@ -1,8 +1,12 @@
|
||||||
#include "game_systems.h"
|
#include "game_systems.h"
|
||||||
#include "particle_sys.h"
|
|
||||||
|
#include "scene_impl.h"
|
||||||
#include "ent_impl.h"
|
#include "ent_impl.h"
|
||||||
|
|
||||||
|
#include "particle_sys.h"
|
||||||
#include "AABB.h"
|
#include "AABB.h"
|
||||||
#include "EC.h"
|
#include "EC.h"
|
||||||
|
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -48,8 +52,8 @@ static inline void destroy_tile(LevelSceneData_t* lvl_data, unsigned int tile_id
|
||||||
.spr = spr,
|
.spr = spr,
|
||||||
.config = get_emitter_conf(&scene->engine->assets, "pe_burst"),
|
.config = get_emitter_conf(&scene->engine->assets, "pe_burst"),
|
||||||
.position = {
|
.position = {
|
||||||
.x = 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 / 2,
|
.y = tile_idx / tilemap.width * tilemap.tile_size + (tilemap.tile_size >> 1),
|
||||||
},
|
},
|
||||||
.n_particles = 5,
|
.n_particles = 5,
|
||||||
.user_data = CONTAINER_OF(lvl_data, LevelScene_t, data),
|
.user_data = CONTAINER_OF(lvl_data, LevelScene_t, data),
|
||||||
|
@ -71,6 +75,7 @@ static bool check_collision_and_move(
|
||||||
SolidType_t other_solid
|
SolidType_t other_solid
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
// TODO: Need some NULL checks to be more robust
|
||||||
CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T);
|
CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T);
|
||||||
CBBox_t* p_bbox = get_component(ent, CBBOX_COMP_T);
|
CBBox_t* p_bbox = get_component(ent, CBBOX_COMP_T);
|
||||||
Vector2 overlap = {0,0};
|
Vector2 overlap = {0,0};
|
||||||
|
@ -149,24 +154,14 @@ collision_end:
|
||||||
return overlap_mode > 0;
|
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};
|
Vector2 half_size = {0,0};
|
||||||
CBBox_t* p_bbox = get_component(p_ent, CBBOX_COMP_T);
|
CBBox_t* p_bbox = get_component(p_ent, CBBOX_COMP_T);
|
||||||
if (p_bbox != NULL)
|
if (p_bbox != NULL)
|
||||||
{
|
{
|
||||||
half_size = p_bbox->half_size;
|
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)
|
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);
|
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)
|
void check_player_dead_system(Scene_t* scene)
|
||||||
|
@ -564,7 +559,6 @@ void player_crushing_system(Scene_t* scene)
|
||||||
Entity_t* p_player;
|
Entity_t* p_player;
|
||||||
sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], 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);
|
CBBox_t* p_bbox = get_component(p_player, CBBOX_COMP_T);
|
||||||
|
|
||||||
uint8_t edges = check_bbox_edges(
|
uint8_t edges = check_bbox_edges(
|
||||||
|
|
|
@ -94,6 +94,7 @@ void free_game_scene(LevelScene_t* scene);
|
||||||
void init_sandbox_scene(LevelScene_t* scene);
|
void init_sandbox_scene(LevelScene_t* scene);
|
||||||
void free_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 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 clear_all_game_entities(LevelScene_t* scene);
|
||||||
void term_level_scene_data(LevelSceneData_t* data);
|
void term_level_scene_data(LevelSceneData_t* data);
|
||||||
void reload_level_tilemap(LevelScene_t* scene);
|
void reload_level_tilemap(LevelScene_t* scene);
|
||||||
|
|
|
@ -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)
|
void clear_all_game_entities(LevelScene_t* scene)
|
||||||
{
|
{
|
||||||
Entity_t* ent;
|
Entity_t* ent;
|
||||||
sc_map_foreach_value(&scene->scene.ent_manager.entities, ent)
|
sc_map_foreach_value(&scene->scene.ent_manager.entities, ent)
|
||||||
{
|
{
|
||||||
CWaterRunner_t* p_crunner = get_component(ent, CWATERRUNNER_T);
|
clear_an_entity(&scene->scene, &scene->data.tilemap, ent);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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);
|
clear_entity_manager(&scene->scene.ent_manager);
|
||||||
for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++)
|
for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue