#pragma once #include "external/fkyaml_node.hpp" #include "game/entities/hazard.hpp" // Forat al sòl: hazard estàtic de 16×16 que NO bloqueja el pas però // detecta quan el jugador hi cau a sobre. Característiques: // - `collides_=false` + `triggers_on_overlap_=true`: rep `onPlayerContact` // pel bucle de `EntityManager::checkPlayerCollisions` sense bloquejar // el moviment del jugador. // - `height_=0`: el filtre de col·lisió per altura existent deixa que // un jugador AIRBORNE amb `jump_z_>0` el creui sense disparar res // (saltar per damunt d'un forat). // - Damage 0: el contacte no publica `player_hit`. En lloc d'això, // `onPlayerContact` invoca `Player::enterHoleFall`, que transiciona // el jugador a AIRBORNE amb subestat `falling_through_hole_`. // - Verificació amb hit-box interna: `onPlayerContact` re-verifica // l'overlap amb `Player::getHitBox()` (8×8 centrada al sprite), // així només es dispara quan el centre del jugador entra al tile. // - Z-order: `is_floor_decal_=true` (heretat) — `Entity::getFeetY()` // retorna sentinel mínim, així el forat es pinta abans que qualsevol // actor i les momies passen per davant. L'efecte "el sòl es traga el // jugador" no es fa amb Y-sort: el `Player::render` aplica un clip // rect mentre `falling_through_hole_=true` que retalla el sprite per // sota de la base del tile del forat. class Hole : public StaticHazard { public: explicit Hole(const fkyaml::node& yaml); // No publica `player_hit`. En el seu lloc, dispara // `Player::enterHoleFall(center_x, center_y, floor_y)` perquè el // jugador armi el clip rect a la Y de la base del forat. void onPlayerContact(Player* player) override; };