35 lines
1.7 KiB
C++
35 lines
1.7 KiB
C++
#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;
|
||
};
|