Files
aee-arcade/source/game/entities/entity_manager.hpp
T

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};
};