From ec0f233033e78e89e35c3c67c2289767173bd89a Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 5 Apr 2026 14:35:53 +0200 Subject: [PATCH] logo alternatiu opcional --- data/logo/logo_new.gif | Bin 0 -> 7998 bytes source/external/gif.h | 23 ++-- source/game/defaults.hpp | 1 + source/game/modulesequence.cpp | 201 ++++++++++++++++++++++++++++----- source/game/modulesequence.hpp | 4 + source/game/options.cpp | 3 + source/game/options.hpp | 1 + 7 files changed, 196 insertions(+), 37 deletions(-) create mode 100644 data/logo/logo_new.gif diff --git a/data/logo/logo_new.gif b/data/logo/logo_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..441f637d61ae191922e037753c24afbaa50e6b4a GIT binary patch literal 7998 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 0; i--) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -399,7 +421,7 @@ void ModuleSequence::doIntro() { for (int i = 200; i >= 80; i--) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -417,7 +439,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 200; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -435,7 +457,7 @@ void ModuleSequence::doIntro() { for (int i = 300; i >= 95; i--) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -455,7 +477,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 50; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -477,7 +499,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 49; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -497,7 +519,7 @@ void ModuleSequence::doIntro() { for (int i = 50; i <= 99; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -517,7 +539,7 @@ void ModuleSequence::doIntro() { for (int i = 80; i >= 0; i--) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -537,7 +559,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 150; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -552,7 +574,7 @@ void ModuleSequence::doIntro() { // camina cap a la DRETA } for (int i = 0; i <= 200; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -572,7 +594,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 300; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -592,7 +614,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 100; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -614,7 +636,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 200; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -638,7 +660,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 75; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -660,7 +682,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 19; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -680,7 +702,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 200; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -704,7 +726,7 @@ void ModuleSequence::doIntro() { // camina cap a la DRETA } for (int i = 0; i <= 145; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -724,7 +746,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 100; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -744,7 +766,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 50; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -766,7 +788,7 @@ void ModuleSequence::doIntro() { for (int i = 0; i <= 800; i++) { JD8_ClearScreen(0); - JD8_Blit(43, 78, gfx, 43, 155, 231, 45); + 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); @@ -790,6 +812,129 @@ void ModuleSequence::doIntro() { JD8_FreeSurface(gfx); } +void ModuleSequence::doIntroNewLogo() { + // Coordenades mesurades del wordmark "Jailgames" dins logo/logo_new.gif + // (imatge 320x200, fons negre = index 0, lletres en index 17 = verd brillant). + // TUNE: ajusta aquests valors si canvies el logo. + constexpr int LOGO_SRC_X = 60; // x d'inici de la 'J' a la imatge font + constexpr int LOGO_SRC_Y = 158; // y del top del wordmark a la imatge font + constexpr int LOGO_DST_Y = 78; // y de destinació en pantalla (igual que logo vell) + constexpr int LOGO_HEIGHT = 28; // alçada del wordmark + // Amplada del crop des de LOGO_SRC_X fins al final de cada lletra + // (J, Ja, Jai, Jail, Jailg, Jailga, Jailgam, Jailgame, Jailgames): + constexpr int LETTER_WIDTHS[9] = {16, 39, 50, 69, 92, 115, 146, 169, 188}; + // Cursor horitzontal (subratllat) al peu de la lletra següent que apareixerà. + // x absolut en pantalla, on comença cada cursor (just després de l'última lletra revelada): + constexpr int CURSOR_X[9] = {77, 100, 111, 130, 153, 176, 207, 230, 249}; + constexpr int CURSOR_W = 12; + constexpr int CURSOR_H = 3; + constexpr int CURSOR_Y = LOGO_DST_Y + LOGO_HEIGHT - CURSOR_H; // peu de la lletra (y=103) + constexpr Uint8 CURSOR_COLOR = 17; // mateix index verd que les lletres (cicla amb el palette) + + JG_SetUpdateTicks(1000); + + play_music("00000003.ogg"); + + JD8_Surface gfx = JD8_LoadSurface("logo/logo_new.gif"); + JD8_Palette pal = JD8_LoadPalette("logo/logo_new.gif"); + JD8_SetScreenPalette(pal); + + // Surface auxiliar plena amb el color del cursor, per poder "blittejar" rectangles. + JD8_Surface cursor_surf = JD8_NewSurface(); + memset(cursor_surf, CURSOR_COLOR, 64000); + + auto cleanup = [&]() { + JD8_FreeSurface(gfx); + JD8_FreeSurface(cursor_surf); + }; + auto waitTick = [&]() -> bool { + // Retorna true si cal sortir (tecla o quitting). + while (!JG_ShouldUpdate()) { + JI_Update(); + if (JI_AnyKey() || JG_Quitting()) return true; + } + return false; + }; + + JD8_ClearScreen(0); + JD8_Flip(); + if (waitTick()) { + cleanup(); + return; + } + + JG_SetUpdateTicks(150); + + // Revelat progressiu lletra-a-lletra amb cursor parpadejant (subratllat horitzontal). + for (int i = 0; i < 9; i++) { + // Frame amb cursor visible + JD8_ClearScreen(0); + JD8_Blit(LOGO_SRC_X, LOGO_DST_Y, gfx, LOGO_SRC_X, LOGO_SRC_Y, LETTER_WIDTHS[i], LOGO_HEIGHT); + JD8_Blit(CURSOR_X[i], CURSOR_Y, cursor_surf, 0, 0, CURSOR_W, CURSOR_H); + JD8_Flip(); + if (waitTick()) { + cleanup(); + return; + } + + // Frame sense cursor (parpadeig) + JD8_ClearScreen(0); + JD8_Blit(LOGO_SRC_X, LOGO_DST_Y, gfx, LOGO_SRC_X, LOGO_SRC_Y, LETTER_WIDTHS[i], LOGO_HEIGHT); + JD8_Flip(); + if (waitTick()) { + cleanup(); + return; + } + } + + // Mostra el logo complet amb el cursor final fix un moment més. + JG_SetUpdateTicks(200); + JD8_ClearScreen(0); + JD8_Blit(LOGO_SRC_X, LOGO_DST_Y, gfx, LOGO_SRC_X, LOGO_SRC_Y, LETTER_WIDTHS[8], LOGO_HEIGHT); + JD8_Blit(CURSOR_X[8], CURSOR_Y, cursor_surf, 0, 0, CURSOR_W, CURSOR_H); + JD8_Flip(); + if (waitTick()) { + cleanup(); + return; + } + + // Treu el cursor abans del cicle de paleta (els seus pixels cicla rien amb les lletres). + JD8_ClearScreen(0); + JD8_Blit(LOGO_SRC_X, LOGO_DST_Y, gfx, LOGO_SRC_X, LOGO_SRC_Y, LETTER_WIDTHS[8], LOGO_HEIGHT); + JD8_Flip(); + + // Cicle de paleta final (mateix efecte que l'intro original, indexs 16-31). + JG_SetUpdateTicks(20); + for (int j = 0; j < 256; j++) { + for (int i = 16; i < 32; i++) { + if (i == 17) { + if (pal[i].r < 255) pal[i].r++; + if (pal[i].g < 255) pal[i].g++; + if (pal[i].b < 255) pal[i].b++; + } + if (pal[i].b < pal[i].g) pal[i].b++; + if (pal[i].b > pal[i].g) pal[i].b--; + if (pal[i].r < pal[i].g) pal[i].r++; + if (pal[i].r > pal[i].g) pal[i].r--; + } + JD8_Flip(); + if (waitTick()) { + cleanup(); + return; + } + } + + // Espera abans d'entrar a les animacions de sprites (igual que l'intro vella). + if (waitTick()) { + cleanup(); + return; + } + + // doIntroSprites pren propietat de gfx i el allibera ell mateix. + JD8_FreeSurface(cursor_surf); + doIntroSprites(gfx); +} + void ModuleSequence::doMenu() { JG_SetUpdateTicks(20); JD8_Surface fondo = JD8_LoadSurface("menu.gif"); diff --git a/source/game/modulesequence.hpp b/source/game/modulesequence.hpp index 89da26a..67d770d 100644 --- a/source/game/modulesequence.hpp +++ b/source/game/modulesequence.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "game/info.hpp" class ModuleSequence { @@ -11,6 +13,8 @@ class ModuleSequence { private: void doIntro(); + void doIntroNewLogo(); + void doIntroSprites(Uint8* gfx); void doMenu(); void doSlides(); void doBanner(); diff --git a/source/game/options.cpp b/source/game/options.cpp index ba80b71..c478de3 100644 --- a/source/game/options.cpp +++ b/source/game/options.cpp @@ -144,6 +144,8 @@ namespace Options { game.piramide_inicial = node["piramide_inicial"].get_value(); if (node.contains("vides")) game.vides = node["vides"].get_value(); + if (node.contains("use_new_logo")) + game.use_new_logo = node["use_new_logo"].get_value(); } // Carrega les opcions des del fitxer configurat @@ -274,6 +276,7 @@ namespace Options { file << " habitacio_inicial: " << game.habitacio_inicial << "\n"; file << " piramide_inicial: " << game.piramide_inicial << "\n"; file << " vides: " << game.vides << "\n"; + file << " use_new_logo: " << (game.use_new_logo ? "true" : "false") << "\n"; file << "\n"; // CONTROLS diff --git a/source/game/options.hpp b/source/game/options.hpp index f291377..5491c0e 100644 --- a/source/game/options.hpp +++ b/source/game/options.hpp @@ -83,6 +83,7 @@ namespace Options { int habitacio_inicial{Defaults::Game::HABITACIO_INICIAL}; int piramide_inicial{Defaults::Game::PIRAMIDE_INICIAL}; int vides{Defaults::Game::VIDES}; + bool use_new_logo{Defaults::Game::USE_NEW_LOGO}; }; // Preset PostFX