Decouple player dead and respawn system

main
En Yi 2024-08-15 11:55:22 +08:00
parent 2461244f6b
commit e762f62f40
4 changed files with 30 additions and 9 deletions

View File

@ -1296,6 +1296,7 @@ void init_sandbox_scene(LevelScene_t* scene)
sc_array_add(&scene->scene.systems, &camera_update_system);
sc_array_add(&scene->scene.systems, &player_dir_reset_system);
sc_array_add(&scene->scene.systems, &update_water_runner_system);
sc_array_add(&scene->scene.systems, &check_player_dead_system);
sc_array_add(&scene->scene.systems, &player_respawn_system);
sc_array_add(&scene->scene.systems, &level_end_detection_system);
sc_array_add(&scene->scene.systems, &render_editor_game_scene);

View File

@ -471,7 +471,8 @@ void init_game_scene(LevelScene_t* scene)
sc_array_add(&scene->scene.systems, &sprite_animation_system);
sc_array_add(&scene->scene.systems, &camera_update_system);
sc_array_add(&scene->scene.systems, &player_dir_reset_system);
sc_array_add(&scene->scene.systems, &player_respawn_system);
sc_array_add(&scene->scene.systems, &check_player_dead_system);
//sc_array_add(&scene->scene.systems, &player_respawn_system);
sc_array_add(&scene->scene.systems, &update_water_runner_system);
sc_array_add(&scene->scene.systems, &render_regular_game_scene);
sc_array_add(&scene->scene.systems, &level_scene_render_func);

View File

@ -228,6 +228,27 @@ void destroy_entity(Scene_t* scene, TileGrid_t* tilemap, Entity_t* p_ent)
remove_entity_from_tilemap(&scene->ent_manager, tilemap, p_ent);
}
void check_player_dead_system(Scene_t* scene)
{
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
TileGrid_t tilemap = data->tilemap;
Entity_t* p_player;
// 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)
{
if (!p_player->m_alive)
{
Entity_t* ent = create_dead_player(&scene->ent_manager);
if (ent != NULL)
{
ent->position = p_player->position;
}
destroy_entity(scene, &data->tilemap, p_player);
}
}
}
void player_respawn_system(Scene_t* scene)
{
Entity_t* p_player;
@ -237,14 +258,10 @@ void player_respawn_system(Scene_t* scene)
{
if (!p_player->m_alive)
{
CTransform_t* p_ct = get_component(p_player, CTRANSFORM_COMP_T);
Entity_t* ent = create_dead_player(&scene->ent_manager);
if (ent != NULL)
{
ent->position = p_player->position;
}
p_player->m_alive = true;
p_player->position = p_player->spawn_pos;
Entity_t* new_player = create_player(&scene->ent_manager);
CTransform_t* p_ct = get_component(new_player, CTRANSFORM_COMP_T);
new_player->position = p_player->spawn_pos;
memset(&p_ct->velocity, 0, sizeof(p_ct->velocity));
memset(&p_ct->accel, 0, sizeof(p_ct->accel));
}
@ -507,6 +524,7 @@ 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(

View File

@ -23,6 +23,7 @@ void camera_update_system(Scene_t* scene);
void container_destroy_system(Scene_t* scene);
void player_dir_reset_system(Scene_t* scene);
void player_respawn_system(Scene_t* scene);
void check_player_dead_system(Scene_t* scene);
void lifetimer_update_system(Scene_t* scene);
void airtimer_update_system(Scene_t* scene);
void spike_collision_system(Scene_t* scene);