diff --git a/source/game/entities/entity_manager.hpp b/source/game/entities/entity_manager.hpp index da9192a..30453d6 100644 --- a/source/game/entities/entity_manager.hpp +++ b/source/game/entities/entity_manager.hpp @@ -90,6 +90,16 @@ class EntityManager { // `Map::tile_size`, `tilemap_origin_*` i `getSarcRect`). void loadFromLevel(const std::string& level_yaml_path); + // Reset complet del nivell: destrueix totes les entitats, reseteja + // els comptadors interns (sarcòfags oberts, total, exited, flag de + // level_complete) i torna a cridar `loadFromLevel` per regenerar les + // entitats des del YAML. El bus i les seues subscripcions + // sobreviuen — això inclou les subscripcions externes (paint_layer_, + // hud_, players, GameScene). Cridat des de GameScene a la transició + // ROOM_OUTRO → ROOM_INTRO. `setExpectedPlayerCount` cal cridar-lo de + // nou després si vols agregació de level_complete al nou cicle. + void reload(const std::string& level_yaml_path); + // Fixa quants jugadors actius es consideren al recompte d'EXITED. // Cridat per GameScene un cop instanciats els jugadors. Si manca, // `expected_players_ = 0` i mai s'emet `level_complete` automàticament. diff --git a/source/game/entities/entity_manager_loadlevel.cpp b/source/game/entities/entity_manager_loadlevel.cpp index ee0f0ef..b73080f 100644 --- a/source/game/entities/entity_manager_loadlevel.cpp +++ b/source/game/entities/entity_manager_loadlevel.cpp @@ -355,6 +355,25 @@ namespace { } } // namespace +void EntityManager::reload(const std::string& level_yaml_path) { + // Destrucció ordenada: les entitats moren aquí; les seues + // subscripcions implícites desapareixen amb la seua vida (cap d'elles + // se subscriu directament al bus — només publiquen). El bus i les + // subscripcions externes (PaintLayer, HUD, GameScene) no es toquen. + entities_.clear(); + door_ = nullptr; + total_sarcs_ = 0; + opened_sarcs_ = 0; + // No reset de `expected_players_`: GameScene el tornarà a fixar + // (amb el mateix valor o un de nou) després del reload, com a part + // del respawn dels jugadors. Reseteig dels comptadors d'EXITED i + // del flag d'emissió perquè el cicle següent pugui reagregar net. + exited_players_ = 0; + level_complete_emitted_ = false; + + loadFromLevel(level_yaml_path); +} + void EntityManager::loadFromLevel(const std::string& level_yaml_path) { const auto SPAWNS = EntityLoader::readSpawns(level_yaml_path); int loaded = 0; diff --git a/source/game/map/paint_layer.cpp b/source/game/map/paint_layer.cpp index 297b629..5d79b20 100644 --- a/source/game/map/paint_layer.cpp +++ b/source/game/map/paint_layer.cpp @@ -82,6 +82,13 @@ auto PaintLayer::isPainted(int col, int row) const -> bool { return painted_[static_cast(row)][static_cast(col)] >= 0; } +void PaintLayer::clear() { + // Mateixa geometria que al ctor: matriu de tiles a -1 (no pintat) i + // buffer ARGB a zero (alpha=0 = transparent → render no escriu res). + painted_.assign(static_cast(rows_), std::vector(static_cast(cols_), -1)); + std::ranges::fill(pixels_, 0U); +} + auto PaintLayer::tryPaint(int col, int row, int tile_index, int player_id) -> bool { if (col < 0 || col >= cols_ || row < 0 || row >= rows_) { return false; } if (tile_index < 0) { return false; } diff --git a/source/game/map/paint_layer.hpp b/source/game/map/paint_layer.hpp index d67c09e..6885823 100644 --- a/source/game/map/paint_layer.hpp +++ b/source/game/map/paint_layer.hpp @@ -48,6 +48,13 @@ class PaintLayer { [[nodiscard]] auto isPainted(int col, int row) const -> bool; + // Buida el pintat acumulat. Marca tots els tiles com a no pintats i + // reseteja el buffer ARGB a alpha=0 (transparent). Cridat per + // GameScene a la transició ROOM_OUTRO → ROOM_INTRO. La subscripció + // al bus es manté — el PaintLayer continuarà reaccionant a + // `on_tile_entered` un cop els jugadors hagin reaparegut. + void clear(); + private: void blitPaintTile(int col, int row, int tile_index);