68 lines
2.6 KiB
C++
68 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include <cstddef>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "game/entities/event_bus.hpp"
|
|
|
|
class Entity;
|
|
class Sarcophagus;
|
|
class Door;
|
|
|
|
// Contenidor i coordinador d'entitats d'un nivell. Responsabilitats:
|
|
// 1. `add` registra una entitat, la connecta al bus i manté propietat.
|
|
// 2. `update(dt)` propaga el tick a totes.
|
|
// 3. Comptador de sarcòfags oberts — quan iguala el total registrat,
|
|
// crida `door_->open()` automàticament.
|
|
// 4. `notifyPlayerEnteredTile(col, row)` — fan-out del hook per a tots
|
|
// els sarcòfags (i qualsevol entitat futura que s'hi subscrigui via
|
|
// `notifyTileEntered`).
|
|
//
|
|
// NO és un singleton: es crea una instància per nivell. De moment no
|
|
// s'usa encara al GameScene (andamiatge pur).
|
|
class EntityManager {
|
|
public:
|
|
EntityManager();
|
|
~EntityManager();
|
|
|
|
EntityManager(const EntityManager&) = delete;
|
|
EntityManager(EntityManager&&) = delete;
|
|
auto operator=(const EntityManager&) -> EntityManager& = delete;
|
|
auto operator=(EntityManager&&) -> EntityManager& = delete;
|
|
|
|
// Registre d'una entitat. L'ownership és del manager; retorna
|
|
// l'observador per conveniència (no eximeix que el manager la destrueixi).
|
|
auto add(std::unique_ptr<Entity> entity) -> Entity*;
|
|
|
|
// Marca una entitat com a porta principal del nivell. N'hi ha només
|
|
// una. Si ja n'hi ha una assignada, la substitueix (útil a tests).
|
|
void setDoor(Door* door);
|
|
|
|
// Marca una entitat com a sarcòfag — si no es passa per `add` amb
|
|
// type=sarcophagus no es compta al total. Útil en combinació amb
|
|
// `add` quan es fa addSarcophagus(unique_ptr<Sarcophagus>).
|
|
auto addSarcophagus(std::unique_ptr<Sarcophagus> sarc) -> Sarcophagus*;
|
|
|
|
// Tick de totes les entitats.
|
|
void update(float delta_time);
|
|
|
|
// Fan-out del hook de moviment de jugador: per a cada sarcòfag,
|
|
// cridar notifyTileEntered. Les entitats no-sarcòfag ho ignoren per
|
|
// defecte (veure Entity::notifyTileEntered).
|
|
void notifyPlayerEnteredTile(int col, int row);
|
|
|
|
[[nodiscard]] auto getBus() -> EventBus& { return bus_; }
|
|
[[nodiscard]] auto entityCount() const -> std::size_t { return entities_.size(); }
|
|
[[nodiscard]] auto sarcophagusCount() const -> std::size_t { return total_sarcs_; }
|
|
[[nodiscard]] auto openedSarcophagusCount() const -> std::size_t { return opened_sarcs_; }
|
|
|
|
private:
|
|
EventBus bus_;
|
|
std::vector<std::unique_ptr<Entity>> entities_;
|
|
Door* door_{nullptr};
|
|
std::size_t total_sarcs_{0};
|
|
std::size_t opened_sarcs_{0};
|
|
EventBus::SubId sarc_sub_id_{0};
|
|
};
|