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

@@ -1,11 +1,7 @@
#include "game/modulesequence.hpp"
#include <stdlib.h>
#include "core/jail/jdraw8.hpp"
#include "core/jail/jgame.hpp"
#include "core/jail/jinput.hpp"
#include "game/options.hpp"
ModuleSequence::ModuleSequence() {
}
@@ -13,20 +9,6 @@ ModuleSequence::ModuleSequence() {
ModuleSequence::~ModuleSequence(void) {
}
namespace {
// Espera fins que passe el tick de JG_ShouldUpdate o fins que el jugador
// polse qualsevol tecla. Torna `true` si la seqüència s'ha de cancel·lar.
// Centralitza el patró repetit de les cinemàtiques; a la Fase 5 (quan
// eliminem el game thread) passarà a ser un pas de màquina d'estats real.
bool wait_frame_or_skip() {
while (!JG_ShouldUpdate()) {
JI_Update();
if (JI_AnyKey() || JG_Quitting()) return true;
}
return false;
}
} // namespace
int ModuleSequence::Go() {
if (info::ctx.num_piramide == 6 && info::ctx.diners < 200) info::ctx.num_piramide = 7;
@@ -38,6 +20,7 @@ int ModuleSequence::Go() {
// case 8 (Credits) → scenes::CreditsScene
// case 100 (Mort) → scenes::MortScene
// case 255 (Intro) → scenes::IntroScene / scenes::IntroNewLogoScene
// (amb scenes::IntroSpritesScene com a sub-escena)
// El gameFiberEntry les dispatcha via SceneRegistry abans de caure a
// aquest Go() — així que en la pràctica ja no s'arriba ací. El codi
// que queda sota (JD8_FadeOut + transicions de num_piramide) serà
@@ -53,8 +36,6 @@ int ModuleSequence::Go() {
return 1;
} else if (info::ctx.num_piramide == 0) {
info::ctx.num_piramide = 1;
// info::ctx.num_piramide = 6;
// info::ctx.diners = 200;
return 1;
} else if (info::ctx.num_piramide == 7) {
info::ctx.num_piramide = 8;
@@ -69,533 +50,4 @@ int ModuleSequence::Go() {
return 0;
}
}
return 0;
}
const int minim(const int a, const int b) {
if (b < a) {
return b;
} else {
return a;
}
}
// Pinta el wordmark JAILGAMES/Jailgames en el mateix lloc (y=78) durant les
// animacions de sprites de l'intro. Branqueja entre logo vell i nou segons
// Options::game.use_new_logo.
static void drawIntroWordmark(JD8_Surface gfx) {
if (Options::game.use_new_logo) {
JD8_Blit(60, 78, gfx, 60, 158, 188, 28);
} else {
JD8_Blit(43, 78, gfx, 43, 155, 231, 45);
}
}
void ModuleSequence::doIntroSprites(JD8_Surface gfx) {
JG_SetUpdateTicks(20);
Uint16 fr1 = 13;
Uint16 fr2 = fr1;
Uint16 fr3 = 11;
Uint16 fr4 = fr3;
Uint16 fr5 = 20;
Uint16 fr6 = 8;
Uint16 fr7 = 29;
Uint16 fr8 = 4;
Uint16 fr9 = 16;
Uint16 fr10 = fr9;
Uint16 fr11 = 6;
Uint16 creu = 75;
Uint16 interrogant = 90;
Uint16 fr_ani_1[13]; // camina dreta
Uint16 fr_ani_2[13]; // camina esquerra
Uint16 fr_ani_3[11]; // trau el mapa DRETA
Uint16 fr_ani_4[11]; // trau el mapa ESQUERRA
Uint16 fr_ani_5[20]; // bot de susto
Uint16 fr_ani_6[8]; // momia
Uint16 fr_ani_7[29]; // deixa caure el PAPER i SOMBRA
Uint16 fr_ani_8[4]; // PEDRA
Uint16 fr_ani_9[16]; // prota BALL
Uint16 fr_ani_10[16]; // momia BALL
Uint16 fr_ani_11[6]; // altaveu
for (int i = 0; i < fr1; i++) fr_ani_1[i] = i * 15;
for (int i = 0; i < fr2; i++) fr_ani_2[i] = i * 15; // 15
for (int i = 0; i < fr3; i++) fr_ani_3[i] = i * 15; // 30
for (int i = 0; i < fr4; i++) fr_ani_4[i] = i * 15; // 45
for (int i = 0; i <= 9; i++) fr_ani_5[i] = (i + 11) * 15; // 45
for (int i = 10; i <= 19; i++) fr_ani_5[i] = fr_ani_5[19 - i];
for (int i = 0; i < fr6; i++) fr_ani_6[i] = i * 15; // 60
for (int i = 0; i <= 13; i++) fr_ani_7[i] = (i + 5) * 15; // 75
for (int i = 14; i < fr7; i++) fr_ani_7[i] = (i - 14) * 15; // 105
for (int i = 0; i < fr8; i++) fr_ani_8[i] = (i + 1) * 15; // 75
for (int i = 0; i < fr9; i++) fr_ani_9[i] = i * 15; // 120
for (int i = 0; i < fr10; i++) fr_ani_10[i] = i * 15; // 135
for (int i = 0; i < fr11; i++) fr_ani_11[i] = (i + 1) * 15; // 90
fr_ani_11[fr11 - 1] = fr_ani_11[3];
switch (rand() % 3) {
case 0:
// camina cap a la DRETA }
for (int i = 0; i <= 200; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_1[(i div 5) mod fr1],15,15,i,150);
JD8_BlitCK(i, 150, gfx, fr_ani_1[(i / 5) % fr1], 0, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// trau el MAPA DRETA }
for (int i = 0; i <= 200; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_3[minim((i div 5),fr3-1)],15,15,200,150);
JD8_BlitCK(200, 150, gfx, fr_ani_3[minim((i / 5), fr3 - 1)], 30, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// guarda el MAPA }
for (int i = 200; i >= 0; i--) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_3[minim((i div 5),fr3-1)],15,15,200,150);
JD8_BlitCK(200, 150, gfx, fr_ani_3[minim((i / 5), fr3 - 1)], 30, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// camina cap a la ESQUERRA }
for (int i = 200; i >= 80; i--) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_2[(i div 5) mod fr2],15,15,i,150);
JD8_BlitCK(i, 150, gfx, fr_ani_2[(i / 5) % fr2], 15, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// trau el MAPA ESQUERRA }
for (int i = 0; i <= 200; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_4[minim((i div 5),fr4-1)],15,15,80,150);
JD8_BlitCK(80, 150, gfx, fr_ani_4[minim((i / 5), fr4 - 1)], 45, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// momia cap a la ESQUERRA }
for (int i = 300; i >= 95; i--) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_6[(i div 10) mod fr6],15,15,i,150);
JD8_BlitCK(i, 150, gfx, fr_ani_6[(i / 5) % fr6], 60, 15, 15, 0);
// Put_sprite(from,where,fr_ani_4[fr4-1],15,15,80,150);
JD8_BlitCK(80, 150, gfx, fr_ani_4[fr4 - 1], 45, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// girar-se }
for (int i = 0; i <= 50; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_1[1],15,15,80,150);
JD8_BlitCK(80, 150, gfx, fr_ani_1[1], 0, 15, 15, 0);
// Put_sprite(from,where,fr_ani_6[4],15,15,95,150);
JD8_BlitCK(95, 150, gfx, fr_ani_6[4], 60, 15, 15, 0);
// Put_sprite(from,where,interrogant,15,15,80,133);
JD8_BlitCK(80, 133, gfx, 0, interrogant, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// bot de SUSTO }
for (int i = 0; i <= 49; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_5[minim((i div 5),fr5-1)],15,15,80,150-((i mod 50) div 5));
JD8_BlitCK(80, 150 - ((i % 50) / 5), gfx, fr_ani_5[minim(i / 5, fr5 - 1)], 45, 15, 15, 0);
// Put_sprite(from,where,fr_ani_6[4],15,15,95,150);
JD8_BlitCK(95, 150, gfx, fr_ani_6[4], 60, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// bot de SUSTO }
for (int i = 50; i <= 99; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_5[minim((i div 5),fr5-1)],15,15,80,140+((i mod 50) div 5));
JD8_BlitCK(80, 140 + ((i % 50) / 5), gfx, fr_ani_5[minim(i / 5, fr5 - 1)], 45, 15, 15, 0);
// Put_sprite(from,where,fr_ani_6[4],15,15,95,150);
JD8_BlitCK(95, 150, gfx, fr_ani_6[4], 60, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// camina cap a la ESQUERRA }
for (int i = 80; i >= 0; i--) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_2[(i div 5) mod fr2],15,15,i,150);
JD8_BlitCK(i, 150, gfx, fr_ani_2[(i / 5) % fr2], 15, 15, 15, 0);
// Put_sprite(from,where,fr_ani_6[4],15,15,95,150);
JD8_BlitCK(95, 150, gfx, fr_ani_6[4], 60, 15, 15, 0);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// final }
for (int i = 0; i <= 150; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_6[4],15,15,95,150);
JD8_BlitCK(95, 150, gfx, fr_ani_6[4], 60, 15, 15, 0);
// Put_sprite(from,where,interrogant,15,15,95,133);
JD8_BlitCK(95, 133, gfx, 0, interrogant, 15, 15, 0);
JD8_Flip();
}
//-----}
break;
case 1:
// camina cap a la DRETA }
for (int i = 0; i <= 200; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,creu,15,15,200,155);
JD8_BlitCK(200, 155, gfx, 0, creu, 15, 15, 255);
// Put_sprite(from,where,fr_ani_1[(i div 5) mod fr1],15,15,i,150);
JD8_BlitCK(i, 150, gfx, fr_ani_1[(i / 5) % fr1], 0, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// trau el MAPA DRETA }
for (int i = 0; i <= 300; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,creu,15,15,200,155);
JD8_BlitCK(200, 155, gfx, 0, creu, 15, 15, 255);
// Put_sprite(from,where,fr_ani_3[minim((i div 5),fr3-1)],15,15,200,150);
JD8_BlitCK(200, 150, gfx, fr_ani_3[minim(i / 5, fr3 - 1)], 30, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// INTERROGANT }
for (int i = 0; i <= 100; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,creu,15,15,200,155);
JD8_BlitCK(200, 155, gfx, 0, creu, 15, 15, 255);
// Put_sprite(from,where,interrogant,15,15,200,134);
JD8_BlitCK(200, 134, gfx, 0, interrogant, 15, 15, 255);
// Put_sprite(from,where,fr_ani_3[fr3-1],15,15,200,150);
JD8_BlitCK(200, 150, gfx, fr_ani_3[fr3 - 1], 30, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// deixa caure el MAPA i SOMBRA }
for (int i = 0; i <= 200; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,creu,15,15,200,155);
JD8_BlitCK(200, 155, gfx, 0, creu, 15, 15, 255);
// Put_sprite(from,where,fr_ani_7[minim((i div 5),fr7-1)],15,15,200,150);
if (minim(i / 5, fr7 - 1) <= 13) {
JD8_BlitCK(200, 150, gfx, fr_ani_7[minim(i / 5, fr7 - 1)], 75, 15, 15, 255);
} else {
JD8_BlitCK(200, 150, gfx, fr_ani_7[minim(i / 5, fr7 - 1)], 105, 15, 15, 255);
}
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// SOMBRA i PEDRA }
for (int i = 0; i <= 75; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,creu,15,15,200,155);
JD8_BlitCK(200, 155, gfx, 0, creu, 15, 15, 255);
// Put_sprite(from,where,fr_ani_7[fr7-1],15,15,200,150);
JD8_BlitCK(200, 150, gfx, fr_ani_7[fr7 - 1], 105, 15, 15, 255);
// Put_sprite(from,where,fr_ani_8[0],15,15,200,i*2);
JD8_BlitCK(200, i * 2, gfx, fr_ani_8[0], 75, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// trencar PEDRA }
for (int i = 0; i <= 19; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,creu,15,15,200,155);
JD8_BlitCK(200, 155, gfx, 0, creu, 15, 15, 255);
// Put_sprite(from,where,fr_ani_8[i div 10],15,15,200,150);
JD8_BlitCK(200, 150, gfx, fr_ani_8[i / 10], 75, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// FINAL }
for (int i = 0; i <= 200; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,creu,15,15,200,155);
JD8_BlitCK(200, 155, gfx, 0, creu, 15, 15, 255);
// Put_sprite(from,where,fr_ani_8[1],15,15,200,150);
JD8_BlitCK(200, 150, gfx, fr_ani_8[1], 75, 15, 15, 255);
// Put_sprite(from,where,fr_ani_8[2],15,15,185,150);
JD8_BlitCK(185, 150, gfx, fr_ani_8[2], 75, 15, 15, 255);
// Put_sprite(from,where,fr_ani_8[3],15,15,215,150);
JD8_BlitCK(215, 150, gfx, fr_ani_8[3], 75, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
break;
case 2:
// camina cap a la DRETA }
for (int i = 0; i <= 145; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_1[(i div 5) mod fr1],15,15,i,150);
JD8_BlitCK(i, 150, gfx, fr_ani_1[(i / 5) % fr1], 0, 15, 15, 255);
// Put_sprite(from,where,fr_ani_6[(i div 10) mod fr6],15,15,304-i,150);
JD8_BlitCK(304 - i, 150, gfx, fr_ani_6[(i / 10) % fr6], 60, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// els dos quets }
for (int i = 0; i <= 100; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_1[1],15,15,145,150);
JD8_BlitCK(145, 150, gfx, fr_ani_1[1], 0, 15, 15, 255);
// Put_sprite(from,where,fr_ani_6[1],15,15,160,150);
JD8_BlitCK(160, 150, gfx, fr_ani_6[1], 60, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// aparicio altaveu }
for (int i = 0; i <= 50; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_11[(i div 10) mod 2],15,15,125,150);
JD8_BlitCK(125, 150, gfx, fr_ani_11[(i / 10) % 2], 90, 15, 15, 255);
// Put_sprite(from,where,fr_ani_1[1],15,15,145,150);
JD8_BlitCK(145, 150, gfx, fr_ani_1[1], 0, 15, 15, 255);
// Put_sprite(from,where,fr_ani_6[1],15,15,160,150);
JD8_BlitCK(160, 150, gfx, fr_ani_6[1], 60, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
// BALL }
for (int i = 0; i <= 800; i++) {
JD8_ClearScreen(0);
drawIntroWordmark(gfx);
// Put_sprite(from,where,fr_ani_9[(i div 10) mod fr9],15,15,145,150);
JD8_BlitCK(145, 150, gfx, fr_ani_9[(i / 10) % fr9], 120, 15, 15, 255);
// Put_sprite(from,where,fr_ani_10[(i div 10) mod fr10],15,15,160,150);
JD8_BlitCK(160, 150, gfx, fr_ani_10[(i / 10) % fr10], 135, 15, 15, 255);
// Put_sprite(from,where,fr_ani_11[((i div 5) mod 4)+2],15,15,125,150);
JD8_BlitCK(125, 150, gfx, fr_ani_11[((i / 5) % 4) + 2], 90, 15, 15, 255);
JD8_Flip();
if (wait_frame_or_skip()) {
JD8_FreeSurface(gfx);
return;
}
}
break;
}
JD8_FreeSurface(gfx);
}
// doIntroNewLogo() — migrat a scenes::IntroNewLogoScene (source/scenes/intro_new_logo_scene.cpp)
// doMenu() — migrat a scenes::MenuScene (source/scenes/menu_scene.cpp)
// doSlides() — migrat a scenes::SlidesScene (source/scenes/slides_scene.cpp)
// doBanner() — migrat a scenes::BannerScene (source/scenes/banner_scene.cpp)
// doSecreta() — migrat a scenes::SecretaScene (source/scenes/secreta_scene.cpp)
// doCredits() — migrat a scenes::CreditsScene (source/scenes/credits_scene.cpp)
// doMort() — migrat a scenes::MortScene (source/scenes/mort_scene.cpp)