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
@@ -28,6 +28,31 @@ void Entity::notifyTilePainted(int /*col*/, int /*row*/) {
|
||||
// No-op per defecte; només `Sarcophagus` l'usa.
|
||||
}
|
||||
|
||||
auto Entity::onWhipHit(WhipAttack* /*attack*/) -> bool {
|
||||
// No-op per defecte; les entitats no-whippables (Torch, Hole, Sarc,
|
||||
// Door, RollingRock...) retornen `false`. `Mummy` n'és l'override
|
||||
// efectiu. El caller usa el retorn per marcar `already_hit_` —
|
||||
// entitats que no han rebut dany NO bloquegen futurs frames del whip.
|
||||
return false;
|
||||
}
|
||||
|
||||
void Entity::onJustSpawned() {
|
||||
// No-op per defecte. `DynamicHazard` override per disparar el seu
|
||||
// `triggerSpawnExit` (anima la fase EMERGING just després de néixer).
|
||||
}
|
||||
|
||||
void Entity::onRemoved() {
|
||||
// No-op per defecte. `Sarcophagus` override per decrementar el
|
||||
// comptador `total_sarcs_` del manager.
|
||||
}
|
||||
|
||||
auto Entity::shouldReceiveContact() const -> bool {
|
||||
// Default: l'entitat rep contacte si és sòlida (`collides_`) o si és
|
||||
// un trigger d'àrea (`triggers_on_overlap_`). `DynamicHazard` afegeix
|
||||
// el filtre de SPAWN — mentre està emergint, ignora contactes.
|
||||
return collides_ || triggers_on_overlap_;
|
||||
}
|
||||
|
||||
auto Entity::getCollisionRect() const -> SDL_FRect {
|
||||
if (!collision_box_.has_value()) { return pixel_rect_; }
|
||||
return {
|
||||
|
||||
Reference in new issue
Block a user