#pragma once #include "game/entities/entity.hpp" class Player; // Base d'entitats d'atac: spawnejades pels jugadors, viuen poc temps i // poden danyar `Hazard`s i altres `Player`s (mai el seu propi `owner_`). // // Branca paral·lela a `Hazard` (no hereta d'ella) perquè la semàntica és // inversa: un `Hazard` és un perill estàtic/dinàmic que toca el jugador, // mentre que un `Attack` és el jugador qui colpeja la resta. Mantenir-les // separades permet, p. ex., que un atac no aparega al test de "què colpeja // al Player en el seu rect" (`EntityManager::checkPlayerCollisions`) perquè // el sentit del filtre és un altre. // // `Attack` no col·lisiona al test de moviment (els atacs no bloquegen // passos). El càlcul de quins objectius reben dany el fa cada subclasse // segons la seua geometria (rectangle direccional per al látigo, cercle // per a una explosió de bomba en el futur, etc.). class Attack : public Entity { public: Attack() { collides_ = false; interactable_ = false; } void setOwner(Player* owner) { owner_ = owner; } [[nodiscard]] auto getOwner() const -> Player* { return owner_; } protected: // Jugador que ha llançat l'atac. No rep dany del seu propi atac // (anti-self-friendly-fire). `nullptr` només a tests sintètics. Player* owner_{nullptr}; };