Files
aee/source/game/modulegame.hpp
T

70 lines
2.3 KiB
C++

#pragma once
#include <cstdint>
#include <memory>
#include <vector>
#include "game/bola.hpp"
#include "game/info.hpp"
#include "game/mapa.hpp"
#include "game/marcador.hpp"
#include "game/momia.hpp"
#include "game/prota.hpp"
#include "game/scenes/palette_fade.hpp"
#include "game/scenes/scene.hpp"
// Escena de gameplay pur. Reemplaça el vell `Go()` bloquejant amb
// l'interfície `scenes::Scene` tick-based: `onEnter()` arranca la
// música i un fade-in, el `tick()` avança un frame (Draw + Update
// gated per JG_ShouldUpdate), i quan la partida acaba fa un fade-out
// abans de retornar el next state.
//
// Tres fases internes:
// 1. FADING_IN — fade-in 32 passos mentre el render segueix viu.
// 2. Playing — gameplay normal; `final_` es setja quan el prota mor
// o canvia de sala. `Update()` només avança cada 10 ms
// via `JG_ShouldUpdate` (ticker fix del jail).
// 3. FADING_OUT — fade-out 32 passos mantenint l'últim frame visible
// (substituïx el `JD8_FadeOut` bloquejant que feia el
// destructor legacy).
class ModuleGame : public scenes::Scene {
public:
ModuleGame();
~ModuleGame() override;
ModuleGame(const ModuleGame&) = delete;
auto operator=(const ModuleGame&) -> ModuleGame& = delete;
ModuleGame(ModuleGame&&) = delete;
auto operator=(ModuleGame&&) -> ModuleGame& = delete;
void onEnter() override;
void tick(int delta_ms) override;
[[nodiscard]] auto done() const -> bool override { return phase_ == Phase::DONE; }
[[nodiscard]] auto nextState() const -> int override;
private:
enum class Phase : std::uint8_t {
FADING_IN,
PLAYING,
FADING_OUT,
DONE,
};
void draw(); // render a `screen`; no crida Jd8::flip (ho fa el caller)
void update(); // gated per JG_ShouldUpdate
void iniciarMomies();
void applyFinalTransitions() const; // muta info::ctx quan final_ passa a !=0
Phase phase_{Phase::FADING_IN};
scenes::PaletteFade fade_;
Uint8 final_{0};
Jd8::Surface gfx_{nullptr};
std::unique_ptr<Mapa> mapa_;
std::unique_ptr<Prota> sam_;
std::unique_ptr<Marcador> marcador_;
std::vector<std::unique_ptr<Momia>> momies_;
std::unique_ptr<Bola> bola_;
};