38 lines
1.2 KiB
C++
38 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <unordered_map>
|
|
|
|
#include "scenes/scene.hpp"
|
|
|
|
namespace scenes {
|
|
|
|
// Mapa de `state_key` (actualment = `info::ctx.num_piramide`) a factory
|
|
// d'escena. Permet que el dispatch de `gameFiberEntry` provi primer una
|
|
// Scene nova i caiga al vell `ModuleSequence::Go()` si encara no està
|
|
// migrada.
|
|
//
|
|
// Registre inicial: `Director::init()` cridarà `instance()` i afegirà
|
|
// una entrada per cada escena ja portada. A mesura que vagen caient, les
|
|
// línies del registre creixen i les funcions `doX()` del modulesequence
|
|
// desapareixen.
|
|
class SceneRegistry {
|
|
public:
|
|
using Factory = std::function<std::unique_ptr<Scene>()>;
|
|
|
|
static SceneRegistry& instance();
|
|
|
|
void registerScene(int state_key, Factory factory);
|
|
|
|
// Retorna `nullptr` si no hi ha cap escena registrada per a aquest
|
|
// state. El caller hauria de caure al path legacy en aquest cas.
|
|
std::unique_ptr<Scene> tryCreate(int state_key) const;
|
|
|
|
private:
|
|
SceneRegistry() = default;
|
|
std::unordered_map<int, Factory> factories_;
|
|
};
|
|
|
|
} // namespace scenes
|