feat(debug): selector d'escena inicial via debug.yaml
Director encadena LOGO → TITLE → INTRO → GAME amb factories injectades al ctor de cada placeholder (sense que cap escena conegui el tipus de la següent). L'escena d'arrencada surt de `debug.yaml` en debug build i és sempre LOGO en release. Comportament: - Release: `debug.yaml` s'ignora; arranca sempre a LOGO. - Debug: es llig `debug.yaml`. Si no existeix, es crea automàticament amb `start_scene: GAME` per no arrossegar 15 s de placeholders al dia a dia de gameplay. Valor invàlid o YAML corrupte → warning + GAME, però el fitxer no es reescriu (respectem l'edició manual). `debug.yaml` viu a `$XDG_CONFIG_HOME/jailgames/aee_2026/`, al costat de `config.yaml`, i queda fora del repo (ajust per màquina de dev).
This commit is contained in:
1 parent
d31483124e
commit
87a9f098b5
4 files changed
+180
-1
No files matched your search
@@ -21,8 +21,12 @@
|
||||
#include "core/resources/resource_cache.hpp"
|
||||
#include "core/scene/scene.hpp"
|
||||
#include "core/system/event_buffer.hpp"
|
||||
#include "game/debug_config.hpp"
|
||||
#include "game/options.hpp"
|
||||
#include "game/scenes/game_scene.hpp"
|
||||
#include "game/scenes/intro_scene.hpp"
|
||||
#include "game/scenes/logo_scene.hpp"
|
||||
#include "game/scenes/title_scene.hpp"
|
||||
#include "game/ui/ui_palette.hpp"
|
||||
#include "utils/defaults.hpp"
|
||||
|
||||
@@ -91,7 +95,45 @@ Director::Director() {
|
||||
RenderInfo::get().init(Options::buildRenderInfoFrame(UiColor::RENDER_INFO_TEXT, UiColor::RENDER_INFO_SHADOW), hud_text);
|
||||
Notifier::get().init(hud_text, ui_palette);
|
||||
|
||||
current_scene_ = std::make_unique<GameScene>();
|
||||
// Flux d'escenes LOGO → TITLE → INTRO → GAME. Cada placeholder rep una
|
||||
// factory que construeix la següent, construïda bottom-up des de GAME.
|
||||
//
|
||||
// Release: sempre s'arranca a LOGO (el flux complet, el que veu el
|
||||
// jugador final). Debug: s'obri `debug.yaml`; si no existeix, el creem
|
||||
// amb `start_scene: GAME` perquè el dia a dia de gameplay no es mengi
|
||||
// els 15 s de placeholders. L'usuari pot editar-lo a mà per escollir
|
||||
// un punt d'entrada intermedi.
|
||||
#ifdef _DEBUG
|
||||
const auto DEBUG_YAML = system_folder_ + "debug.yaml";
|
||||
DebugConfig::createDefaultIfMissing(DEBUG_YAML);
|
||||
const auto START = DebugConfig::resolveStartScene(DEBUG_YAML);
|
||||
#else
|
||||
const auto START = DebugConfig::StartScene::LOGO;
|
||||
#endif
|
||||
std::cout << "Director: start_scene=" << DebugConfig::toString(START) << '\n';
|
||||
|
||||
auto make_game = []() -> std::unique_ptr<Scene> { return std::make_unique<GameScene>(); };
|
||||
auto make_intro = [hud_text, make_game]() -> std::unique_ptr<Scene> {
|
||||
return std::make_unique<IntroScene>(hud_text, make_game);
|
||||
};
|
||||
auto make_title = [hud_text, make_intro]() -> std::unique_ptr<Scene> {
|
||||
return std::make_unique<TitleScene>(hud_text, make_intro);
|
||||
};
|
||||
|
||||
switch (START) {
|
||||
case DebugConfig::StartScene::LOGO:
|
||||
current_scene_ = std::make_unique<LogoScene>(hud_text, make_title);
|
||||
break;
|
||||
case DebugConfig::StartScene::TITLE:
|
||||
current_scene_ = make_title();
|
||||
break;
|
||||
case DebugConfig::StartScene::INTRO:
|
||||
current_scene_ = make_intro();
|
||||
break;
|
||||
case DebugConfig::StartScene::GAME:
|
||||
current_scene_ = make_game();
|
||||
break;
|
||||
}
|
||||
last_ticks_ms_ = SDL_GetTicks();
|
||||
}
|
||||
|
||||
@@ -143,6 +185,8 @@ void Director::processEvents() {
|
||||
void Director::switchSceneIfRequested() {
|
||||
if (!current_scene_) { return; }
|
||||
if (auto next = current_scene_->nextScene()) {
|
||||
// TODO: migrar a logger unificat (INC-03 a docs/audit-core-rendering.md).
|
||||
std::cout << "Director: scene transition\n";
|
||||
current_scene_ = std::move(next);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user