feat(entities): andamiatge del sistema d'entitats (classes, factory, bus, YAML, placeholders, smoke tests)
This commit is contained in:
1 parent
984cc820c0
commit
96b71b0f65
48 files changed
+1957
No files matched your search
@@ -0,0 +1,67 @@
|
||||
#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};
|
||||
};
|
||||
Reference in new issue
Block a user