48 lines
1.9 KiB
C++
48 lines
1.9 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <vector>
|
|
|
|
#include "external/fkyaml_node.hpp"
|
|
#include "game/entities/hazard.hpp"
|
|
|
|
// Mòmia: perill dinàmic que deambula pels passadís. A cada intersecció
|
|
// tria una direcció vàlida; l'algoritme per triar-la és un hook virtual
|
|
// (`chooseDirection`) que la base implementa com a aleatori uniforme
|
|
// sobre les direccions admissibles. Futurs derivats poden sesgar cap al
|
|
// jugador sense tocar la lògica de moviment.
|
|
//
|
|
// Andamiatge: el concepte d'"intersecció" i la validació de direcció
|
|
// requereixen conèixer el mapa. De moment l'exposem com un conjunt de
|
|
// direccions admissibles que l'EntityManager injecta; la implementació
|
|
// real arribarà quan cablegem l'entitat al game loop.
|
|
class Mummy : public DynamicHazard {
|
|
public:
|
|
enum class Direction : std::uint8_t { NONE,
|
|
UP,
|
|
DOWN,
|
|
LEFT,
|
|
RIGHT };
|
|
|
|
explicit Mummy(const fkyaml::node& yaml);
|
|
|
|
// Hook d'IA. Donat un conjunt de direccions admissibles, decideix la
|
|
// següent direcció a prendre. La implementació de la base tria una
|
|
// aleatoria; si `allowed` està buit, retorna `NONE`.
|
|
virtual auto chooseDirection(const std::vector<Direction>& allowed) -> Direction;
|
|
|
|
// Política de moviment "corridor_wanderer": camina recte fins que el
|
|
// pròxim tram la bloquejaria (mur del playfield o sarc). Quan troba un
|
|
// obstacle, recull les direccions perpendiculars vàlides (evitant
|
|
// U-turn llevat que no hi hagi alternativa) i crida `chooseDirection`
|
|
// per decidir-ne una. No consumeix moviment el frame de gir.
|
|
void step(float delta_time) override;
|
|
|
|
// Contacte amb el jugador: publica `player_hit` amb el dany.
|
|
void onPlayerContact(Player* player) override;
|
|
|
|
private:
|
|
// Caixa de col·lisió candidata si l'entitat es desplaçara (dx, dy).
|
|
[[nodiscard]] auto candidateBox(float dx, float dy) const -> SDL_FRect;
|
|
};
|