64 lines
1.9 KiB
C++
64 lines
1.9 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <variant>
|
|
|
|
#include "game/debug_config.hpp"
|
|
|
|
// Sistema centralitzat de transicions entre escenes. Cada escena, en lloc
|
|
// de construir directament la següent, declara una `ExitRequest` amb un
|
|
// identificador i els paràmetres que la nova escena necessite per
|
|
// arrencar; `Director::buildScene` és l'únic punt que sap com instanciar
|
|
// cada tipus i té tots els recursos a mà.
|
|
//
|
|
// Afegir una escena nova:
|
|
// 1. Una entrada al `enum SceneId`.
|
|
// 2. Si necessita paràmetres, un struct `*Params` i afegir-lo al variant.
|
|
// 3. Un cas a `Director::buildScene` que el construïsca.
|
|
//
|
|
// Una escena només pot demanar transicionar a un altre `SceneId` que
|
|
// haja estat enregistrat al variant — el compilador ja descarta noms
|
|
// erronis.
|
|
enum class SceneId : std::uint8_t {
|
|
LOGO,
|
|
TITLE,
|
|
INTRO,
|
|
GAME,
|
|
};
|
|
|
|
// Estructures de paràmetres per escena. Buides quan la nova escena no
|
|
// rep cap dada de l'anterior; en cas contrari, només els camps que
|
|
// fluixen pel canal de transició (els recursos, defaults i config
|
|
// interna els resol Director quan construeix).
|
|
struct LogoParams {};
|
|
struct TitleParams {};
|
|
struct IntroParams {
|
|
DebugConfig::StartingPlayers starting_players{DebugConfig::StartingPlayers::BOTH};
|
|
};
|
|
struct GameParams {
|
|
DebugConfig::StartingPlayers starting_players{DebugConfig::StartingPlayers::BOTH};
|
|
};
|
|
|
|
using SceneParams = std::variant<LogoParams, TitleParams, IntroParams, GameParams>;
|
|
|
|
struct ExitRequest {
|
|
SceneId next;
|
|
SceneParams params;
|
|
};
|
|
|
|
// Helper per a logs / debug. Implementat inline per evitar un .cpp per a
|
|
// una funció de tres línies.
|
|
[[nodiscard]] inline auto toString(SceneId id) -> const char* {
|
|
switch (id) {
|
|
case SceneId::LOGO:
|
|
return "LOGO";
|
|
case SceneId::TITLE:
|
|
return "TITLE";
|
|
case SceneId::INTRO:
|
|
return "INTRO";
|
|
case SceneId::GAME:
|
|
return "GAME";
|
|
}
|
|
return "?";
|
|
}
|