feat(demo): attract mode amb pilot IA, escenaris curats i música contínua del títol

This commit is contained in:
2026-05-28 12:01:12 +02:00
parent 491992a4d7
commit c1956e0028
11 changed files with 404 additions and 27 deletions
+28 -1
View File
@@ -94,7 +94,15 @@ TitleScene::TitleScene(SDLManager& sdl, SceneContext& context)
}
TitleScene::~TitleScene() {
Audio::get()->stopMusic();
// Attract mode: si saltem a la demo, NO parem la música — ha de seguir
// sonant durant tot el cicle TÍTOL→DEMO→LOGO→TÍTOL. La resta de sortides
// (partida normal, EXIT) sí paren.
const bool ENTERING_DEMO =
context_.nextScene() == SceneType::GAME &&
context_.getMatchConfig().mode == GameConfig::Mode::DEMO;
if (!ENTERING_DEMO) {
Audio::get()->stopMusic();
}
}
void TitleScene::initTitle() {
@@ -340,6 +348,25 @@ void TitleScene::update(float delta_time) {
handleSkipInput();
handleStartInput();
}
// Attract mode: al state MAIN, acumular inactivitat; qualsevol botó
// arcade la reseteja. En esgotar el timeout, saltar a la demo (mode DEMO,
// P1 actiu) sense fer fadeOut de la música (a diferència del START real).
if (current_state_ == TitleState::MAIN && !INPUT_BLOCKED) {
if (Input::get()->checkAnyPlayerAction(ARCADE_BUTTONS, Input::ALLOW_REPEAT)) {
idle_timer_ = 0.0F;
} else {
idle_timer_ += delta_time;
}
if (idle_timer_ >= TITLE_DEMO_TIMEOUT) {
GameConfig::MatchConfig demo_cfg;
demo_cfg.player1_active = true;
demo_cfg.player2_active = false;
demo_cfg.mode = GameConfig::Mode::DEMO;
context_.setMatchConfig(demo_cfg);
context_.setNextScene(SceneType::GAME);
}
}
}
void TitleScene::updateStarfieldFadeInState(float delta_time) {