clang-format
mogudes coses de config.yaml a debug.yaml
This commit is contained in:
@@ -9,338 +9,357 @@
|
||||
|
||||
namespace {
|
||||
|
||||
// Duració d'un pas. El vell doIntroSprites feia JG_SetUpdateTicks(20);
|
||||
// cada iteració del seu for (i) consumia un tick de 20 ms.
|
||||
constexpr int TICK_MS = 20;
|
||||
// Duració d'un pas. El vell doIntroSprites feia JG_SetUpdateTicks(20);
|
||||
// cada iteració del seu for (i) consumia un tick de 20 ms.
|
||||
constexpr int TICK_MS = 20;
|
||||
|
||||
// Taules de frames. Ubicacions de cada sprite dins el gfx de la intro
|
||||
// (gfx/logo.gif o gfx/logo_new.gif — el layout de sprites és el mateix).
|
||||
// Cada sprite ocupa 15×15 px, disposats horitzontalment per fila.
|
||||
// Els valors són els offsets x (la y la posa l'invocador al src_y).
|
||||
// Derivats dels `fr_ani_N[i] = ...` del vell doIntroSprites.
|
||||
constexpr Uint16 fr1[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180}; // camina dreta (y=0)
|
||||
constexpr Uint16 fr2[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180}; // camina esquerra (y=15)
|
||||
constexpr Uint16 fr3[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150}; // trau mapa dreta (y=30)
|
||||
constexpr Uint16 fr4[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150}; // trau mapa esquerra (y=45)
|
||||
constexpr Uint16 fr5[] = {165, 180, 195, 210, 225, 240, 255, 270, 285, 300,
|
||||
300, 285, 270, 255, 240, 225, 210, 195, 180, 165}; // bot de susto (y=45, mirror)
|
||||
constexpr Uint16 fr6[] = {0, 15, 30, 45, 60, 75, 90, 105}; // momia (y=60)
|
||||
constexpr Uint16 fr7[] = {75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, // paper (y=75, idx 0..13)
|
||||
0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210}; // sombra (y=105, idx 14..28)
|
||||
constexpr Uint16 fr8[] = {15, 30, 45, 60}; // pedra (y=75)
|
||||
constexpr Uint16 fr9[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225}; // prota ball (y=120)
|
||||
constexpr Uint16 fr10[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225}; // momia ball (y=135)
|
||||
constexpr Uint16 fr11[] = {15, 30, 45, 60, 75, 60}; // altaveu (y=90, [5]=[3] pel loop de 4)
|
||||
// Taules de frames. Ubicacions de cada sprite dins el gfx de la intro
|
||||
// (gfx/logo.gif o gfx/logo_new.gif — el layout de sprites és el mateix).
|
||||
// Cada sprite ocupa 15×15 px, disposats horitzontalment per fila.
|
||||
// Els valors són els offsets x (la y la posa l'invocador al src_y).
|
||||
// Derivats dels `fr_ani_N[i] = ...` del vell doIntroSprites.
|
||||
constexpr Uint16 fr1[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180}; // camina dreta (y=0)
|
||||
constexpr Uint16 fr2[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180}; // camina esquerra (y=15)
|
||||
constexpr Uint16 fr3[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150}; // trau mapa dreta (y=30)
|
||||
constexpr Uint16 fr4[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150}; // trau mapa esquerra (y=45)
|
||||
constexpr Uint16 fr5[] = {165, 180, 195, 210, 225, 240, 255, 270, 285, 300, 300, 285, 270, 255, 240, 225, 210, 195, 180, 165}; // bot de susto (y=45, mirror)
|
||||
constexpr Uint16 fr6[] = {0, 15, 30, 45, 60, 75, 90, 105}; // momia (y=60)
|
||||
constexpr Uint16 fr7[] = {75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, // paper (y=75, idx 0..13)
|
||||
0,
|
||||
15,
|
||||
30,
|
||||
45,
|
||||
60,
|
||||
75,
|
||||
90,
|
||||
105,
|
||||
120,
|
||||
135,
|
||||
150,
|
||||
165,
|
||||
180,
|
||||
195,
|
||||
210}; // sombra (y=105, idx 14..28)
|
||||
constexpr Uint16 fr8[] = {15, 30, 45, 60}; // pedra (y=75)
|
||||
constexpr Uint16 fr9[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225}; // prota ball (y=120)
|
||||
constexpr Uint16 fr10[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225}; // momia ball (y=135)
|
||||
constexpr Uint16 fr11[] = {15, 30, 45, 60, 75, 60}; // altaveu (y=90, [5]=[3] pel loop de 4)
|
||||
|
||||
constexpr Uint16 CREU = 75; // src_y de la creu (overlay)
|
||||
constexpr Uint16 INTERROGANT = 90; // src_y del signe d'interrogant
|
||||
constexpr Uint16 CREU = 75; // src_y de la creu (overlay)
|
||||
constexpr Uint16 INTERROGANT = 90; // src_y del signe d'interrogant
|
||||
|
||||
// Equivalent de la funció `drawIntroWordmark` de modulesequence.cpp.
|
||||
// Branqueja segons use_new_logo perquè la mateixa sub-escena es
|
||||
// reutilitza des de IntroScene (logo vell) i IntroNewLogoScene (logo
|
||||
// nou) amb arxius diferents però mateix layout de sprites.
|
||||
void drawWordmark(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);
|
||||
// Equivalent de la funció `drawIntroWordmark` de modulesequence.cpp.
|
||||
// Branqueja segons use_new_logo perquè la mateixa sub-escena es
|
||||
// reutilitza des de IntroScene (logo vell) i IntroNewLogoScene (logo
|
||||
// nou) amb arxius diferents però mateix layout de sprites.
|
||||
void drawWordmark(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
using RenderFn = void (*)(JD8_Surface, int);
|
||||
using RenderFn = void (*)(JD8_Surface, int);
|
||||
|
||||
// Una fase — rang [start_i..end_i] inclusive (direcció implícita per
|
||||
// signe), funció de render, i flag d'skippable. Totes les fases actuals
|
||||
// són skippables; el flag es conserva per si alguna futura ha de ser
|
||||
// no interrompuda (p.ex. un logo fatídic que cal veure sencer).
|
||||
struct SpritePhase {
|
||||
int start_i;
|
||||
int end_i;
|
||||
RenderFn render;
|
||||
bool skippable;
|
||||
};
|
||||
// Una fase — rang [start_i..end_i] inclusive (direcció implícita per
|
||||
// signe), funció de render, i flag d'skippable. Totes les fases actuals
|
||||
// són skippables; el flag es conserva per si alguna futura ha de ser
|
||||
// no interrompuda (p.ex. un logo fatídic que cal veure sencer).
|
||||
struct SpritePhase {
|
||||
int start_i;
|
||||
int end_i;
|
||||
RenderFn render;
|
||||
bool skippable;
|
||||
};
|
||||
|
||||
// =========================================================================
|
||||
// Variant 0 — Interrogant / Momia
|
||||
// =========================================================================
|
||||
// =========================================================================
|
||||
// Variant 0 — Interrogant / Momia
|
||||
// =========================================================================
|
||||
|
||||
void v0_walk_right(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr1[(i / 5) % 13], 0, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_pull_map_right(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 150, gfx, fr3[std::min(i / 5, 10)], 30, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_walk_left_to_80(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr2[(i / 5) % 13], 15, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_pull_map_left(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(80, 150, gfx, fr4[std::min(i / 5, 10)], 45, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_momia_left(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr6[(i / 5) % 8], 60, 15, 15, 0);
|
||||
JD8_BlitCK(80, 150, gfx, fr4[10], 45, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_turn(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(80, 150, gfx, fr1[1], 0, 15, 15, 0);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
JD8_BlitCK(80, 133, gfx, 0, INTERROGANT, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_jump1(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(80, 150 - ((i % 50) / 5), gfx, fr5[std::min(i / 5, 19)], 45, 15, 15, 0);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_jump2(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(80, 140 + ((i % 50) / 5), gfx, fr5[std::min(i / 5, 19)], 45, 15, 15, 0);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_walk_final(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr2[(i / 5) % 13], 15, 15, 15, 0);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_final(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
JD8_BlitCK(95, 133, gfx, 0, INTERROGANT, 15, 15, 0);
|
||||
}
|
||||
|
||||
constexpr SpritePhase variant_0[] = {
|
||||
{0, 200, v0_walk_right, true},
|
||||
{0, 200, v0_pull_map_right, true},
|
||||
{200, 0, v0_pull_map_right, true}, // guarda el mapa (reprodueix inversament)
|
||||
{200, 80, v0_walk_left_to_80, true},
|
||||
{0, 200, v0_pull_map_left, true},
|
||||
{300, 95, v0_momia_left, true},
|
||||
{0, 50, v0_turn, true},
|
||||
{0, 49, v0_jump1, true},
|
||||
{50, 99, v0_jump2, true},
|
||||
{80, 0, v0_walk_final, true},
|
||||
{0, 150, v0_final, true},
|
||||
};
|
||||
|
||||
// =========================================================================
|
||||
// Variant 1 — Creu / Pedra
|
||||
// =========================================================================
|
||||
|
||||
void v1_walk_right(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(i, 150, gfx, fr1[(i / 5) % 13], 0, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_pull_map(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr3[std::min(i / 5, 10)], 30, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_interrogant(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 134, gfx, 0, INTERROGANT, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr3[10], 30, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_drop_map(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
const int idx = std::min(i / 5, 28);
|
||||
// fr7 té 29 frames dividits en dos grups: paper (idx 0..13, src_y=75)
|
||||
// i sombra (idx 14..28, src_y=105). El vell feia una branca al bucle.
|
||||
if (idx <= 13) {
|
||||
JD8_BlitCK(200, 150, gfx, fr7[idx], 75, 15, 15, 255);
|
||||
} else {
|
||||
JD8_BlitCK(200, 150, gfx, fr7[idx], 105, 15, 15, 255);
|
||||
void v0_walk_right(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr1[(i / 5) % 13], 0, 15, 15, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void v1_stone_fall(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr7[28], 105, 15, 15, 255);
|
||||
JD8_BlitCK(200, i * 2, gfx, fr8[0], 75, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_stone_break(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr8[i / 10], 75, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_final(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr8[1], 75, 15, 15, 255);
|
||||
JD8_BlitCK(185, 150, gfx, fr8[2], 75, 15, 15, 255);
|
||||
JD8_BlitCK(215, 150, gfx, fr8[3], 75, 15, 15, 255);
|
||||
}
|
||||
|
||||
constexpr SpritePhase variant_1[] = {
|
||||
{0, 200, v1_walk_right, true},
|
||||
{0, 300, v1_pull_map, true},
|
||||
{0, 100, v1_interrogant, true},
|
||||
{0, 200, v1_drop_map, true},
|
||||
{0, 75, v1_stone_fall, true},
|
||||
{0, 19, v1_stone_break, true},
|
||||
{0, 200, v1_final, true},
|
||||
};
|
||||
|
||||
// =========================================================================
|
||||
// Variant 2 — Ball de carnaval
|
||||
// =========================================================================
|
||||
|
||||
void v2_approach(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr1[(i / 5) % 13], 0, 15, 15, 255);
|
||||
JD8_BlitCK(304 - i, 150, gfx, fr6[(i / 10) % 8], 60, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v2_still(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(145, 150, gfx, fr1[1], 0, 15, 15, 255);
|
||||
JD8_BlitCK(160, 150, gfx, fr6[1], 60, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v2_horn(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(125, 150, gfx, fr11[(i / 10) % 2], 90, 15, 15, 255);
|
||||
JD8_BlitCK(145, 150, gfx, fr1[1], 0, 15, 15, 255);
|
||||
JD8_BlitCK(160, 150, gfx, fr6[1], 60, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v2_ball(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(145, 150, gfx, fr9[(i / 10) % 16], 120, 15, 15, 255);
|
||||
JD8_BlitCK(160, 150, gfx, fr10[(i / 10) % 16], 135, 15, 15, 255);
|
||||
JD8_BlitCK(125, 150, gfx, fr11[((i / 5) % 4) + 2], 90, 15, 15, 255);
|
||||
}
|
||||
|
||||
constexpr SpritePhase variant_2[] = {
|
||||
{0, 145, v2_approach, true},
|
||||
{0, 100, v2_still, true},
|
||||
{0, 50, v2_horn, true},
|
||||
{0, 800, v2_ball, true},
|
||||
};
|
||||
|
||||
// =========================================================================
|
||||
// Dispatch per variant
|
||||
// =========================================================================
|
||||
|
||||
const SpritePhase* variant_table(int variant) {
|
||||
switch (variant) {
|
||||
case 0: return variant_0;
|
||||
case 1: return variant_1;
|
||||
case 2: return variant_2;
|
||||
void v0_pull_map_right(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 150, gfx, fr3[std::min(i / 5, 10)], 30, 15, 15, 0);
|
||||
}
|
||||
return variant_0;
|
||||
}
|
||||
|
||||
int variant_length(int variant) {
|
||||
switch (variant) {
|
||||
case 0: return sizeof(variant_0) / sizeof(variant_0[0]);
|
||||
case 1: return sizeof(variant_1) / sizeof(variant_1[0]);
|
||||
case 2: return sizeof(variant_2) / sizeof(variant_2[0]);
|
||||
void v0_walk_left_to_80(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr2[(i / 5) % 13], 15, 15, 15, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int phase_step_count(const SpritePhase& p) {
|
||||
return std::abs(p.end_i - p.start_i) + 1;
|
||||
}
|
||||
void v0_pull_map_left(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(80, 150, gfx, fr4[std::min(i / 5, 10)], 45, 15, 15, 0);
|
||||
}
|
||||
|
||||
int phase_current_i(const SpritePhase& p, int step) {
|
||||
return p.end_i >= p.start_i ? p.start_i + step : p.start_i - step;
|
||||
}
|
||||
void v0_momia_left(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr6[(i / 5) % 8], 60, 15, 15, 0);
|
||||
JD8_BlitCK(80, 150, gfx, fr4[10], 45, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_turn(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(80, 150, gfx, fr1[1], 0, 15, 15, 0);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
JD8_BlitCK(80, 133, gfx, 0, INTERROGANT, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_jump1(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(80, 150 - ((i % 50) / 5), gfx, fr5[std::min(i / 5, 19)], 45, 15, 15, 0);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_jump2(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(80, 140 + ((i % 50) / 5), gfx, fr5[std::min(i / 5, 19)], 45, 15, 15, 0);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_walk_final(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr2[(i / 5) % 13], 15, 15, 15, 0);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
}
|
||||
|
||||
void v0_final(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(95, 150, gfx, fr6[4], 60, 15, 15, 0);
|
||||
JD8_BlitCK(95, 133, gfx, 0, INTERROGANT, 15, 15, 0);
|
||||
}
|
||||
|
||||
constexpr SpritePhase variant_0[] = {
|
||||
{0, 200, v0_walk_right, true},
|
||||
{0, 200, v0_pull_map_right, true},
|
||||
{200, 0, v0_pull_map_right, true}, // guarda el mapa (reprodueix inversament)
|
||||
{200, 80, v0_walk_left_to_80, true},
|
||||
{0, 200, v0_pull_map_left, true},
|
||||
{300, 95, v0_momia_left, true},
|
||||
{0, 50, v0_turn, true},
|
||||
{0, 49, v0_jump1, true},
|
||||
{50, 99, v0_jump2, true},
|
||||
{80, 0, v0_walk_final, true},
|
||||
{0, 150, v0_final, true},
|
||||
};
|
||||
|
||||
// =========================================================================
|
||||
// Variant 1 — Creu / Pedra
|
||||
// =========================================================================
|
||||
|
||||
void v1_walk_right(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(i, 150, gfx, fr1[(i / 5) % 13], 0, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_pull_map(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr3[std::min(i / 5, 10)], 30, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_interrogant(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 134, gfx, 0, INTERROGANT, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr3[10], 30, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_drop_map(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
const int idx = std::min(i / 5, 28);
|
||||
// fr7 té 29 frames dividits en dos grups: paper (idx 0..13, src_y=75)
|
||||
// i sombra (idx 14..28, src_y=105). El vell feia una branca al bucle.
|
||||
if (idx <= 13) {
|
||||
JD8_BlitCK(200, 150, gfx, fr7[idx], 75, 15, 15, 255);
|
||||
} else {
|
||||
JD8_BlitCK(200, 150, gfx, fr7[idx], 105, 15, 15, 255);
|
||||
}
|
||||
}
|
||||
|
||||
void v1_stone_fall(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr7[28], 105, 15, 15, 255);
|
||||
JD8_BlitCK(200, i * 2, gfx, fr8[0], 75, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_stone_break(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr8[i / 10], 75, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v1_final(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(200, 155, gfx, 0, CREU, 15, 15, 255);
|
||||
JD8_BlitCK(200, 150, gfx, fr8[1], 75, 15, 15, 255);
|
||||
JD8_BlitCK(185, 150, gfx, fr8[2], 75, 15, 15, 255);
|
||||
JD8_BlitCK(215, 150, gfx, fr8[3], 75, 15, 15, 255);
|
||||
}
|
||||
|
||||
constexpr SpritePhase variant_1[] = {
|
||||
{0, 200, v1_walk_right, true},
|
||||
{0, 300, v1_pull_map, true},
|
||||
{0, 100, v1_interrogant, true},
|
||||
{0, 200, v1_drop_map, true},
|
||||
{0, 75, v1_stone_fall, true},
|
||||
{0, 19, v1_stone_break, true},
|
||||
{0, 200, v1_final, true},
|
||||
};
|
||||
|
||||
// =========================================================================
|
||||
// Variant 2 — Ball de carnaval
|
||||
// =========================================================================
|
||||
|
||||
void v2_approach(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(i, 150, gfx, fr1[(i / 5) % 13], 0, 15, 15, 255);
|
||||
JD8_BlitCK(304 - i, 150, gfx, fr6[(i / 10) % 8], 60, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v2_still(JD8_Surface gfx, int /*i*/) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(145, 150, gfx, fr1[1], 0, 15, 15, 255);
|
||||
JD8_BlitCK(160, 150, gfx, fr6[1], 60, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v2_horn(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(125, 150, gfx, fr11[(i / 10) % 2], 90, 15, 15, 255);
|
||||
JD8_BlitCK(145, 150, gfx, fr1[1], 0, 15, 15, 255);
|
||||
JD8_BlitCK(160, 150, gfx, fr6[1], 60, 15, 15, 255);
|
||||
}
|
||||
|
||||
void v2_ball(JD8_Surface gfx, int i) {
|
||||
JD8_ClearScreen(0);
|
||||
drawWordmark(gfx);
|
||||
JD8_BlitCK(145, 150, gfx, fr9[(i / 10) % 16], 120, 15, 15, 255);
|
||||
JD8_BlitCK(160, 150, gfx, fr10[(i / 10) % 16], 135, 15, 15, 255);
|
||||
JD8_BlitCK(125, 150, gfx, fr11[((i / 5) % 4) + 2], 90, 15, 15, 255);
|
||||
}
|
||||
|
||||
constexpr SpritePhase variant_2[] = {
|
||||
{0, 145, v2_approach, true},
|
||||
{0, 100, v2_still, true},
|
||||
{0, 50, v2_horn, true},
|
||||
{0, 800, v2_ball, true},
|
||||
};
|
||||
|
||||
// =========================================================================
|
||||
// Dispatch per variant
|
||||
// =========================================================================
|
||||
|
||||
const SpritePhase* variant_table(int variant) {
|
||||
switch (variant) {
|
||||
case 0:
|
||||
return variant_0;
|
||||
case 1:
|
||||
return variant_1;
|
||||
case 2:
|
||||
return variant_2;
|
||||
}
|
||||
return variant_0;
|
||||
}
|
||||
|
||||
int variant_length(int variant) {
|
||||
switch (variant) {
|
||||
case 0:
|
||||
return sizeof(variant_0) / sizeof(variant_0[0]);
|
||||
case 1:
|
||||
return sizeof(variant_1) / sizeof(variant_1[0]);
|
||||
case 2:
|
||||
return sizeof(variant_2) / sizeof(variant_2[0]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int phase_step_count(const SpritePhase& p) {
|
||||
return std::abs(p.end_i - p.start_i) + 1;
|
||||
}
|
||||
|
||||
int phase_current_i(const SpritePhase& p, int step) {
|
||||
return p.end_i >= p.start_i ? p.start_i + step : p.start_i - step;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace scenes {
|
||||
|
||||
IntroSpritesScene::IntroSpritesScene(SurfaceHandle&& gfx)
|
||||
: gfx_(std::move(gfx)) {}
|
||||
IntroSpritesScene::IntroSpritesScene(SurfaceHandle&& gfx)
|
||||
: gfx_(std::move(gfx)) {}
|
||||
|
||||
void IntroSpritesScene::onEnter() {
|
||||
// El vell doIntroSprites feia `rand() % 3` al principi. El seed ve
|
||||
// establert per `srand(time(0))` al boot del joc (info.cpp / main),
|
||||
// així que la variant canvia entre execucions.
|
||||
variant_ = std::rand() % 3;
|
||||
phase_ = 0;
|
||||
phase_step_ = 0;
|
||||
step_acc_ms_ = 0;
|
||||
done_ = false;
|
||||
void IntroSpritesScene::onEnter() {
|
||||
// El vell doIntroSprites feia `rand() % 3` al principi. El seed ve
|
||||
// establert per `srand(time(0))` al boot del joc (info.cpp / main),
|
||||
// així que la variant canvia entre execucions.
|
||||
variant_ = std::rand() % 3;
|
||||
phase_ = 0;
|
||||
phase_step_ = 0;
|
||||
step_acc_ms_ = 0;
|
||||
done_ = false;
|
||||
|
||||
// Renderitzem ja el primer frame (step 0 de la primera fase) perquè
|
||||
// el JD8_Flip del mini-loop del fiber el pinte al primer cicle.
|
||||
const SpritePhase* phases = variant_table(variant_);
|
||||
phases[0].render(gfx_.get(), phase_current_i(phases[0], 0));
|
||||
}
|
||||
|
||||
void IntroSpritesScene::tick(int delta_ms) {
|
||||
if (done_) return;
|
||||
|
||||
const SpritePhase* phases = variant_table(variant_);
|
||||
const int num_phases = variant_length(variant_);
|
||||
|
||||
// Skip per tecla. Durant la fase marcada com a no skippable (només
|
||||
// v0_final al vell codi) s'ignora — preserva la semàntica del vell
|
||||
// bucle final de la variant 0 que no cridava wait_frame_or_skip.
|
||||
if (phases[phase_].skippable && JI_AnyKey()) {
|
||||
done_ = true;
|
||||
return;
|
||||
// Renderitzem ja el primer frame (step 0 de la primera fase) perquè
|
||||
// el JD8_Flip del mini-loop del fiber el pinte al primer cicle.
|
||||
const SpritePhase* phases = variant_table(variant_);
|
||||
phases[0].render(gfx_.get(), phase_current_i(phases[0], 0));
|
||||
}
|
||||
|
||||
step_acc_ms_ += delta_ms;
|
||||
while (step_acc_ms_ >= TICK_MS && !done_) {
|
||||
step_acc_ms_ -= TICK_MS;
|
||||
++phase_step_;
|
||||
if (phase_step_ >= phase_step_count(phases[phase_])) {
|
||||
++phase_;
|
||||
phase_step_ = 0;
|
||||
if (phase_ >= num_phases) {
|
||||
done_ = true;
|
||||
return;
|
||||
void IntroSpritesScene::tick(int delta_ms) {
|
||||
if (done_) return;
|
||||
|
||||
const SpritePhase* phases = variant_table(variant_);
|
||||
const int num_phases = variant_length(variant_);
|
||||
|
||||
// Skip per tecla. Durant la fase marcada com a no skippable (només
|
||||
// v0_final al vell codi) s'ignora — preserva la semàntica del vell
|
||||
// bucle final de la variant 0 que no cridava wait_frame_or_skip.
|
||||
if (phases[phase_].skippable && JI_AnyKey()) {
|
||||
done_ = true;
|
||||
return;
|
||||
}
|
||||
|
||||
step_acc_ms_ += delta_ms;
|
||||
while (step_acc_ms_ >= TICK_MS && !done_) {
|
||||
step_acc_ms_ -= TICK_MS;
|
||||
++phase_step_;
|
||||
if (phase_step_ >= phase_step_count(phases[phase_])) {
|
||||
++phase_;
|
||||
phase_step_ = 0;
|
||||
if (phase_ >= num_phases) {
|
||||
done_ = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
phases[phase_].render(gfx_.get(), phase_current_i(phases[phase_], phase_step_));
|
||||
}
|
||||
phases[phase_].render(gfx_.get(), phase_current_i(phases[phase_], phase_step_));
|
||||
}
|
||||
|
||||
} // namespace scenes
|
||||
|
||||
Reference in New Issue
Block a user