step 9: intro_sprites_scene com a sub-escena (elimina doIntroSprites + 3 variants aleatòries)

This commit is contained in:
2026-04-16 08:38:47 +02:00
parent e18b7321eb
commit d343e719ca
9 changed files with 459 additions and 624 deletions

View File

@@ -3,7 +3,6 @@
#include "core/jail/jdraw8.hpp"
#include "core/jail/jinput.hpp"
#include "game/info.hpp"
#include "game/modulesequence.hpp"
#include "scenes/scene_utils.hpp"
namespace {
@@ -110,7 +109,7 @@ void IntroScene::render() {
drawWordmark(gfx_);
break;
case Phase::Delegate:
case Phase::Sprites:
case Phase::Done:
break;
}
@@ -134,12 +133,11 @@ void IntroScene::advancePaletteCycle() {
}
void IntroScene::tick(int delta_ms) {
// Qualsevol tecla durant el revelat/paleta salta TOTA la intro
// (inclou saltar doIntroSprites). El vell `doIntro` tornava abans
// de cridar doIntroSprites quan `wait_frame_or_skip` detectava una
// tecla. Durant `Delegate` deixem que doIntroSprites gestione el
// seu propi skip internament.
if (phase_ != Phase::Delegate && phase_ != Phase::Done && JI_AnyKey()) {
// Qualsevol tecla durant revelat/paleta salta TOTA la intro
// (inclou saltar la fase de sprites). Durant Sprites deixem que
// la sub-escena gestione el seu propi skip internament, que a més
// respecta la fase "final" no skippable de la variant 0.
if (phase_ != Phase::Sprites && phase_ != Phase::Done && JI_AnyKey()) {
info::ctx.num_piramide = 0;
phase_ = Phase::Done;
return;
@@ -189,26 +187,28 @@ void IntroScene::tick(int delta_ms) {
phase_acc_ms_ += delta_ms;
render();
if (phase_acc_ms_ >= FINAL_WAIT_MS) {
phase_ = Phase::Delegate;
phase_ = Phase::Sprites;
}
break;
case Phase::Delegate: {
// Delegació temporal al codi legacy. La funció legacy sempre
// allibera `gfx` ella mateixa (al final i als paths de skip
// amb JI_AnyKey), així que transferim ownership via release()
// per evitar double free al destructor de SurfaceHandle.
// Step 9 reescriurà doIntroSprites com a IntroSpritesScene i
// aquesta delegació desapareixerà.
ModuleSequence legacy;
legacy.doIntroSprites(gfx_.release());
// El vell `Go()` post-switch feia `num_piramide = 0` per
// passar al menú. Replicat ací: si no, el while del fiber
// tornaria a crear IntroScene infinitament.
info::ctx.num_piramide = 0;
phase_ = Phase::Done;
case Phase::Sprites:
// Sub-escena construïda al vol al primer tick d'aquesta fase.
// Transferim el gfx_ per move — la sub-escena se n'ocupa
// fins que es destruix. Una vegada feta, els ticks delegats
// avancen l'animació dels sprites.
if (!sprites_scene_) {
sprites_scene_ = std::make_unique<IntroSpritesScene>(std::move(gfx_));
sprites_scene_->onEnter();
}
sprites_scene_->tick(delta_ms);
if (sprites_scene_->done()) {
// Equivalent al vell `Go()` post-switch: passem al menú.
// Sense açò el while del fiber tornaria a crear IntroScene
// infinitament amb num_piramide encara a 255.
info::ctx.num_piramide = 0;
phase_ = Phase::Done;
}
break;
}
case Phase::Done:
break;