From 6f8ab74d6bbbcdfc105d2877d5845ef9815cfaa7 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Mon, 11 May 2026 11:23:14 +0200 Subject: [PATCH] refactor(whip): applyDamage itera getActors() en lloc de getEntities() --- source/game/entities/concrete/whip_attack.cpp | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/source/game/entities/concrete/whip_attack.cpp b/source/game/entities/concrete/whip_attack.cpp index e75b16e..90f49ed 100644 --- a/source/game/entities/concrete/whip_attack.cpp +++ b/source/game/entities/concrete/whip_attack.cpp @@ -299,19 +299,22 @@ namespace { // 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 // 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( - Entity* e, + DynamicHazard* actor, const SDL_FRect& damage_rect, WhipAttack::Direction dir, std::unordered_set& already_hit) { - if (e == nullptr || e->isDead()) { return; } - if (already_hit.contains(static_cast(e))) { return; } - auto* mummy = dynamic_cast(e); + if (actor == nullptr || actor->isDead()) { return; } + if (already_hit.contains(static_cast(actor))) { return; } + auto* mummy = dynamic_cast(actor); if (mummy == nullptr || !mummy->isWhippable()) { return; } const auto BOX = mummy->getCollisionRect(); if (!SDL_HasRectIntersectionFloat(&damage_rect, &BOX)) { return; } mummy->enterHurt(whipDirToMummyDir(dir)); - already_hit.insert(static_cast(e)); + already_hit.insert(static_cast(actor)); } void hitPlayerIfApplicable( @@ -336,8 +339,12 @@ namespace { void WhipAttack::applyDamage() { if (entity_manager_ != nullptr) { - for (auto* e : entity_manager_->getEntities()) { - hitMummyIfApplicable(e, damage_rect_, direction_, already_hit_); + // Només els actors poden rebre el fuetejo (decoracions, sarcs, + // 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) {