step 9: intro_sprites_scene com a sub-escena (elimina doIntroSprites + 3 variants aleatòries)
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user