refactor(entities): polimorfisme per substituir dynamic_casts
Quatre virtuals nous a `Entity` capten decisions que abans vivien al manager com a discriminacions de tipus: - `onWhipHit(WhipAttack*)` → bool. Default no-op/false. Override a `Mummy` per entrar HURT si és whippable. WhipAttack::applyDamage passa de `dynamic_cast<Mummy*>` + `isWhippable()` a una crida polimòrfica neta. RollingRock no override → immune al látigo per disseny, sense flag. - `onJustSpawned()`. Default no-op. Override a `DynamicHazard` per disparar `triggerSpawnExit()`. `spawnPendingActors` i `spawnActor` passen de `dynamic_cast<DynamicHazard*>(observer)->triggerSpawnExit()` a `observer->onJustSpawned()`. - `onRemoved()`. Default no-op. Override a `Sarcophagus` per cridar `entity_manager_->onSarcophagusRemoved()`. `removeEntity` passa de `getName() == "sarcophagus"` a dispatch polimòrfic. - `shouldReceiveContact()`. Default `collides() || triggersOnOverlap()`. Override a `DynamicHazard` per excloure SPAWN. `checkPlayerCollisions` passa de tres condicions inline per a sacs distints a una crida unificada. `whipDirToMummyDir` es mou de whip_attack.cpp a mummy.cpp — el mapping viu on s'usa (dins de `Mummy::onWhipHit`). `hitMummyIfApplicable` es renomena a `hitEntityIfApplicable`: ja no discrimina tipus, aplica `entity->onWhipHit` i marca `already_hit_` segons el retorn. Comportament idèntic, tests verds. Aquest commit prepara el següent: amb el polimorfisme madurat, el sac dual ja no aporta valor i podem tornar a un únic `entities_`.
This commit is contained in:
1 parent
e8418f89e0
commit
28ff425c89
11 files changed
+177
-58
No files matched your search
@@ -19,6 +19,7 @@ class Player;
|
||||
class EventBus;
|
||||
class Surface;
|
||||
class EntityManager;
|
||||
class WhipAttack;
|
||||
|
||||
// Entitat genèrica del món. Actua com a dada en comú per a tots els actors
|
||||
// del joc (decoratius, interactables, perills mòbils i estàtics): manté
|
||||
@@ -86,6 +87,38 @@ class Entity {
|
||||
// (per marcar perímetre); per defecte no-op.
|
||||
virtual void notifyTilePainted(int col, int row);
|
||||
|
||||
// L'entitat ha rebut un fueteig amb solapament. Es passa el punter al
|
||||
// `WhipAttack` perquè la subclasse pugui llegir-ne direcció o atributs
|
||||
// (mateix patró que `onPlayerContact(Player*)`). Retorna `true` si
|
||||
// efectivament ha aplicat dany — el caller en marca el set
|
||||
// `already_hit_` per evitar segons impactes dins del mateix swing.
|
||||
// Default: no fa res, retorna `false`. Override a `Mummy` (whippable)
|
||||
// i a futurs enemics whippables. `RollingRock` no override → roca
|
||||
// immune al látigo per defecte.
|
||||
virtual auto onWhipHit(WhipAttack* attack) -> bool;
|
||||
|
||||
// Hook just després de néixer al món. El manager el crida quan
|
||||
// `addSpawn` / `spawnActor` / `spawnPendingActors` instancien una
|
||||
// entitat. La base no fa res; `DynamicHazard` override per disparar
|
||||
// el seu `triggerSpawnExit` (anima la fase EMERGING). Substitueix el
|
||||
// `dynamic_cast<DynamicHazard*>(observer)->triggerSpawnExit()` que el
|
||||
// manager feia abans — ara el dispatch és polimòrfic.
|
||||
virtual void onJustSpawned();
|
||||
|
||||
// Hook just abans que el manager esborri l'entitat (via
|
||||
// `removeEntity`, típicament al editor). Permet a subclasses
|
||||
// notificar al manager o publicar events per mantenir invariants
|
||||
// (p.ex. `Sarcophagus` decrementa `total_sarcs_`). Default no-op.
|
||||
virtual void onRemoved();
|
||||
|
||||
// Decisió polimòrfica de si aquesta entitat ha de rebre el callback
|
||||
// `onPlayerContact` aquest frame. La base permet contacte si `collides_`
|
||||
// o `triggers_on_overlap_` estan posats. Subclasses poden afegir
|
||||
// condicions transitòries (p.ex. `DynamicHazard` retorna `false` mentre
|
||||
// està en SPAWN). Centralitza el filtre que abans vivia al manager
|
||||
// amb dynamic_casts/isSpawning explícits.
|
||||
[[nodiscard]] virtual auto shouldReceiveContact() const -> bool;
|
||||
|
||||
[[nodiscard]] auto getName() const -> const std::string& { return name_; }
|
||||
[[nodiscard]] auto getTilePos() const -> TilePos { return tile_; }
|
||||
[[nodiscard]] auto getPixelRect() const -> SDL_FRect { return pixel_rect_; }
|
||||
|
||||
Reference in new issue
Block a user