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
@@ -4,6 +4,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "game/entities/entity_factory.hpp"
|
||||
#include "game/entities/entity_manager.hpp"
|
||||
#include "game/entities/event_bus.hpp"
|
||||
|
||||
namespace {
|
||||
@@ -124,4 +125,16 @@ void Sarcophagus::notifyTilePainted(int col, int row) {
|
||||
}
|
||||
}
|
||||
|
||||
void Sarcophagus::onRemoved() {
|
||||
// El manager comptabilitza els sarcòfags actius en `total_sarcs_` per
|
||||
// saber quan ha d'obrir la porta automàticament. Quan el editor
|
||||
// n'esborra un, cal informar-lo: sense aquesta crida, `total_sarcs_`
|
||||
// quedaria descompassat i la porta no s'obriria mai. Substitueix el
|
||||
// `getName() == "sarcophagus"` que el manager feia abans —
|
||||
// polimorfisme net, no comparació de strings.
|
||||
if (entity_manager_ != nullptr) {
|
||||
entity_manager_->onSarcophagusRemoved();
|
||||
}
|
||||
}
|
||||
|
||||
REGISTER_ENTITY("sarcophagus", Sarcophagus)
|
||||
Reference in new issue
Block a user