refactor(whip): applyDamage itera getActors() en lloc de getEntities()

This commit is contained in:
JailDesigner committed 2026-05-11 11:23:14 +02:00
1 parent 881e0ea1f6
commit 6f8ab74d6b
1 file changed
+14 -7
+14 -7
View File
@@ -299,19 +299,22 @@ namespace {
// Tracta una mòmia candidata: si és whippable i la seua caja solapa // Tracta una mòmia candidata: si és whippable i la seua caja solapa
// amb `damage_rect`, la posa a HURT i la marca al set. Extret per // amb `damage_rect`, la posa a HURT i la marca al set. Extret per
// acotar la complexitat cognitiva d'`applyDamage` (clang-tidy llindar). // acotar la complexitat cognitiva d'`applyDamage` (clang-tidy llindar).
// Rep un `DynamicHazard*` (l'iterador d'`applyDamage` ja filtra el
// sac d'actors); només cal el dynamic_cast a Mummy per descartar
// altres hermanes (RollingRock i futurs DynamicHazards no whippables).
void hitMummyIfApplicable( void hitMummyIfApplicable(
Entity* e, DynamicHazard* actor,
const SDL_FRect& damage_rect, const SDL_FRect& damage_rect,
WhipAttack::Direction dir, WhipAttack::Direction dir,
std::unordered_set<void*>& already_hit) { std::unordered_set<void*>& already_hit) {
if (e == nullptr || e->isDead()) { return; } if (actor == nullptr || actor->isDead()) { return; }
if (already_hit.contains(static_cast<void*>(e))) { return; } if (already_hit.contains(static_cast<void*>(actor))) { return; }
auto* mummy = dynamic_cast<Mummy*>(e); auto* mummy = dynamic_cast<Mummy*>(actor);
if (mummy == nullptr || !mummy->isWhippable()) { return; } if (mummy == nullptr || !mummy->isWhippable()) { return; }
const auto BOX = mummy->getCollisionRect(); const auto BOX = mummy->getCollisionRect();
if (!SDL_HasRectIntersectionFloat(&damage_rect, &BOX)) { return; } if (!SDL_HasRectIntersectionFloat(&damage_rect, &BOX)) { return; }
mummy->enterHurt(whipDirToMummyDir(dir)); mummy->enterHurt(whipDirToMummyDir(dir));
already_hit.insert(static_cast<void*>(e)); already_hit.insert(static_cast<void*>(actor));
} }
void hitPlayerIfApplicable( void hitPlayerIfApplicable(
@@ -336,8 +339,12 @@ namespace {
void WhipAttack::applyDamage() { void WhipAttack::applyDamage() {
if (entity_manager_ != nullptr) { if (entity_manager_ != nullptr) {
for (auto* e : entity_manager_->getEntities()) { // Només els actors poden rebre el fuetejo (decoracions, sarcs,
hitMummyIfApplicable(e, damage_rect_, direction_, already_hit_); // forats... no són hits del whip). Iterem el sac `actors_`
// directament — sense recórrer tot el mapa per descartar-ne la
// major part.
for (auto* actor : entity_manager_->getActors()) {
hitMummyIfApplicable(actor, damage_rect_, direction_, already_hit_);
} }
} }
if (players_ != nullptr) { if (players_ != nullptr) {