diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index 83bda28..f3e5cb9 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -844,40 +844,14 @@ static void restart_editor_level(Scene_t* scene) tilemap.tiles[i].water_level = 0; tilemap.tiles[i].wet = false; tilemap.tiles[i].size = (Vector2){TILE_SIZE, TILE_SIZE}; - Entity_t* ent; - unsigned int m_id; - sc_map_foreach(&tilemap.tiles[i].entities_set, m_id, ent) - { - if (ent->m_tag == PLAYER_ENT_TAG) continue; - CTileCoord_t* p_tilecoord = get_component( - ent, CTILECOORD_COMP_T - ); - for (size_t i = 0;i < p_tilecoord->n_tiles; ++i) - { - // Use previously store tile position - // Clear from those positions - unsigned int tile_idx = p_tilecoord->tiles[i]; - sc_map_del_64v(&(tilemap.tiles[tile_idx].entities_set), m_id); - } - //remove_entity(&scene->ent_manager, m_id); - CWaterRunner_t* p_crunner = get_component(ent, CWATERRUNNER_T); - if (p_crunner == NULL) - { - remove_entity(&scene->ent_manager, m_id); - } - else - { - free_water_runner(ent, &scene->ent_manager); - } - } - } - Entity_t* p_ent; - sc_map_foreach_value(&scene->ent_manager.entities_map[LEVEL_END_TAG], p_ent) - { - remove_entity(&scene->ent_manager, p_ent->m_id); } + clear_all_game_entities(CONTAINER_OF(scene, LevelScene_t, scene)); + + Entity_t* p_player = create_player(&scene->ent_manager); + p_player->position = data->player_spawn; update_entity_manager(&scene->ent_manager); + for (size_t i = 0; i < tilemap.width; ++i) { unsigned int tile_idx = (tilemap.height - 1) * tilemap.width + i; @@ -1086,7 +1060,10 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed) break; case ACTION_NEXTLEVEL: case ACTION_RESTART: - restart_editor_level(scene); + if (!pressed) + { + restart_editor_level(scene); + } break; case ACTION_TOGGLE_GRID: if (!pressed) @@ -1230,7 +1207,7 @@ void init_sandbox_scene(LevelScene_t* scene) p_cspr->flip_x = true; p_player->position.x = 100; - p_player->position.y = (scene->data.tilemap.height - 2) * scene->data.tilemap.tile_size; + p_player->position.y = (scene->data.tilemap.height - 1) * scene->data.tilemap.tile_size - PLAYER_HEIGHT; scene->data.player_spawn = p_player->position; scene->data.camera.target_pos = p_player->position; scene->data.camera.cam.target = p_player->position; @@ -1479,6 +1456,7 @@ void init_sandbox_scene(LevelScene_t* scene) void free_sandbox_scene(LevelScene_t* scene) { + clear_all_game_entities(scene); free_scene(&scene->scene); term_level_scene_data(&scene->data); } diff --git a/scenes/game_scene.c b/scenes/game_scene.c index 8f8e7d4..32cae12 100644 --- a/scenes/game_scene.c +++ b/scenes/game_scene.c @@ -568,6 +568,7 @@ void init_game_scene(LevelScene_t* scene) void free_game_scene(LevelScene_t* scene) { + clear_all_game_entities(scene); free_scene(&scene->scene); term_level_scene_data(&scene->data); } diff --git a/scenes/scene_impl.h b/scenes/scene_impl.h index 66a624d..e19f144 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_all_game_entities(LevelScene_t* scene); void term_level_scene_data(LevelSceneData_t* data); void reload_level_tilemap(LevelScene_t* scene); void load_next_level_tilemap(LevelScene_t* scene); diff --git a/scenes/scene_systems.c b/scenes/scene_systems.c index 2467e91..11e7a06 100644 --- a/scenes/scene_systems.c +++ b/scenes/scene_systems.c @@ -53,6 +53,29 @@ void term_level_scene_data(LevelSceneData_t* data) } } +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_entity_manager(&scene->scene.ent_manager); + for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++) + { + sc_map_clear_64v(&scene->data.tilemap.tiles[i].entities_set); + } +} + bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num) { if (level_num >= scene->data.level_pack->n_levels) return false; @@ -68,7 +91,7 @@ bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num) scene->data.coins.current = 0; scene->data.coins.total = lvl_map.n_chests; - clear_entity_manager(&scene->scene.ent_manager); + clear_all_game_entities(scene); for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++) { @@ -81,8 +104,6 @@ bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num) scene->data.tilemap.tiles[i].offset = (Vector2){0, 0}; scene->data.tilemap.tiles[i].size = (Vector2){TILE_SIZE, TILE_SIZE}; scene->data.tilemap.tiles[i].def = 0; - - sc_map_clear_64v(&scene->data.tilemap.tiles[i].entities_set); if (lvl_map.tiles[i].tile_type == 1) { @@ -279,7 +300,7 @@ void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_ty } else if ((tile_idx + 1) % tilemap->width != 0 && tilemap->tiles[tile_idx + 1].tile_type == SOLID_TILE) { - tilemap->tiles[tile_idx].offset = (Vector2){SPIKE_HITBOX_SHORTSIDE >> 1,0}; + tilemap->tiles[tile_idx].offset = (Vector2){tilemap->tile_size - SPIKE_HITBOX_SHORTSIDE,0}; tilemap->tiles[tile_idx].size = (Vector2){SPIKE_HITBOX_SHORTSIDE, SPIKE_HITBOX_LONGSIDE}; tilemap->tiles[tile_idx].rotation = TILE_90CCWROT; }