diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index 59943e0..f026bd4 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -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); diff --git a/scenes/game_scene.c b/scenes/game_scene.c index 99761ad..471a96a 100644 --- a/scenes/game_scene.c +++ b/scenes/game_scene.c @@ -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); diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 7d80425..3360aea 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -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( diff --git a/scenes/game_systems.h b/scenes/game_systems.h index 38be35c..c752fbe 100644 --- a/scenes/game_systems.h +++ b/scenes/game_systems.h @@ -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);