From d8883372b05850734171f870212aa00fdfff1865 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sat, 16 May 2026 08:53:38 +0200 Subject: [PATCH] Pantalla d'avis, sweep de neteja, jingle i diagrama de tecles --- pepe_pintor.lua | 128 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 110 insertions(+), 18 deletions(-) diff --git a/pepe_pintor.lua b/pepe_pintor.lua index e9cf362..09d4b0b 100644 --- a/pepe_pintor.lua +++ b/pepe_pintor.lua @@ -18,6 +18,12 @@ PARED = 0xB1 -- ▒ paret FONS = 0xDB -- █ fons (sense pintar / pintat = distingit per `pintat`) POT_GLIF = 232 -- ◘ marca visual del pot MALO_GLIF = 88 -- 'X' enemic +NETEJA_GLIF = 176 -- ░ char de neteja_pantalla del Pascal +-- Fletxes (CP437) per al diagrama de tecles del HUD +ARR_UP = 30 -- ▲ +ARR_DOWN = 31 -- ▼ +ARR_LEFT = 17 -- ◄ +ARR_RIGHT = 16 -- ► -- Constants del joc POT_MAX = 90 @@ -42,11 +48,13 @@ MORT_FREQ_STEP = 250 MORT_FRAMES = 36 -- ~600 ms d'animació de mort -- Estats +ESTAT_AVIS = "avis" -- pantalla inicial "AVÍS — Aquest joc encara..." ESTAT_PLAYING = "playing" ESTAT_MURIGUENT = "muriguent" ESTAT_GAMEOVER = "gameover" ESTAT_INTERFASE = "interfase" -- "ENHORABONA!" entre fases (fidel al Pascal) INTERFASE_FRAMES = 240 -- ~4 segons (l'original feia delay(5000) = 5s) +NETEJA_FRAMES = 60 -- duració del sweep de neteja al final del interfase -- ==================================================================== -- ESTAT GLOBAL @@ -91,9 +99,14 @@ function definir_glifs() setchar(PARED, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11) setchar(FONS, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF) setchar(POT_GLIF, 0x00, 0x7E, 0x7E, 0x42, 0x66, 0x7E, 0x3C, 0x00) - -- L'enemic 'X' del CP437 ja és coherent al ROM nadiu d'ascii, però el - -- redefinim igualment per a controlar-ho. setchar(MALO_GLIF, 0x00, 0xC3, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0xC3) + -- Char de la neteja_pantalla del Pascal (chr 176 — ░ tinta clara) + setchar(NETEJA_GLIF, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44) + -- Fletxes triangulars per al diagrama del HUD + setchar(ARR_UP, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0x00, 0x00, 0x00) + setchar(ARR_DOWN, 0x00, 0x00, 0x00, 0xFF, 0x7E, 0x3C, 0x18, 0x00) + setchar(ARR_LEFT, 0x00, 0x10, 0x30, 0x70, 0xF0, 0x70, 0x30, 0x10) + setchar(ARR_RIGHT, 0x00, 0x08, 0x0C, 0x0E, 0x0F, 0x0E, 0x0C, 0x08) end -- ==================================================================== @@ -183,30 +196,44 @@ function pintar_malos() end end --- HUD: pintura, blocs restants, vides (com a ☻), fase, controls +-- HUD: pintura, blocs, fase, vides + diagrama de tecles al lateral dret +-- (fidel a l'original que dibuixava les fletxes Q/A/O/P amb chars 30,31,16,17) function pintar_hud() color(COLOR_LIGHT_GRAY, COLOR_BLUE) local blank = " " for i = HUD_Y0, 29 do print(blank, 0, i) end + -- Columna esquerra: dades del joc color(COLOR_WHITE, COLOR_BLUE) - print("PINTURA "..string.format("%02d", pot).."/"..tostr(POT_MAX), 1, 26) - + print("PINTURA "..string.format("%02d", pot).."/"..tostr(POT_MAX), 1, 25) color(COLOR_YELLOW, COLOR_BLUE) - print("BLOCS "..string.format("%04d", total_blocs), 17, 26) - + print("BLOCS "..string.format("%04d", total_blocs), 1, 26) + color(COLOR_LIGHT_GREEN, COLOR_BLUE) + print("FASE "..tostr(fase), 1, 27) color(COLOR_LIGHT_RED, COLOR_BLUE) for i = 1, vides do - print(chr(PEPE_PLE), 32 + i, 26) + print(chr(PEPE_PLE), 9 + i, 27) end - color(COLOR_LIGHT_GREEN, COLOR_BLUE) - print("FASE "..tostr(fase), 1, 28) + -- Diagrama de tecles (fidel al PINTOR original) + -- Q + -- ▲ + -- O ◄ ► P + -- ▼ + -- A color(COLOR_LIGHT_CYAN, COLOR_BLUE) - print("O P Q A: moure", 12, 28) + print("Q", 30, 25) + print(chr(ARR_UP), 30, 26) + print("O", 28, 27) + print(chr(ARR_LEFT), 29, 27) + print(chr(ARR_RIGHT), 31, 27) + print("P", 32, 27) + print(chr(ARR_DOWN), 30, 28) + print("A", 30, 29) + if truco then color(COLOR_WHITE, COLOR_RED) - print("INVULN", 30, 28) + print("INVULN", 1, 29) end end @@ -306,9 +333,11 @@ function naiximent() return pick.x, pick.y end --- Jingle "música malos" del Pascal (sound creixent i decreixent en bucle) +-- "Música malos" del Pascal: el bucle for de 6 vegades × 41 sounds de 0 a +-- 8000 Hz creixent ràpidament. Aproximem amb una pujada cromàtica que +-- recorre 4-5 octaves en una passada (un sol play, asincron a l'engine). function jingle_malo() - play("l0o3cdefgab>cl0o3cdefgab>c") + play("l0o2cdefgab>cdefgab>cdefgab>cdefgab>cdefg") end -- Check spawn: si total_blocs ha baixat per sota del llindar proporcional al @@ -519,24 +548,85 @@ function update_gameover() end end --- Transició entre fases: ENHORABONA! parpadejant, després passa a la fase --- següent automàticament (fidel al delay(5000) del PINTOR3). +-- Transició entre fases: ENHORABONA! parpadejant, sweep de neteja per +-- columnes (fidel al `neteja_pantalla` del Pascal) i salt a la fase següent. function update_interfase() cls() pintar_mapa() pintar_pot() pintar_pepe() pintar_hud() - if (estat_t // 12) % 2 == 0 then + + -- ENHORABONA! parpadejant durant la primera part + if estat_t < INTERFASE_FRAMES - NETEJA_FRAMES and (estat_t // 12) % 2 == 0 then color(COLOR_LIGHT_GREEN, COLOR_BLACK) print("ENHORABONA!", 14, 11) end + -- Sweep de neteja (últims NETEJA_FRAMES frames). Omplim columnes + -- progressivament amb chr(176) = ░ negre sobre negre. + if estat_t >= INTERFASE_FRAMES - NETEJA_FRAMES then + local progr = estat_t - (INTERFASE_FRAMES - NETEJA_FRAMES) + local cols = flr(progr * MAP_W / NETEJA_FRAMES) + if cols > MAP_W then cols = MAP_W end + color(COLOR_DARK_GRAY, COLOR_BLACK) + for x = 0, cols - 1 do + for y = 0, MAP_H - 1 do + print(chr(NETEJA_GLIF), x, y) + end + end + end + if estat_t >= INTERFASE_FRAMES then avancar_fase() end end +-- Pantalla AVÍS inicial (fidel a beta_version del PINTOR2/PEPEDIEG). +-- Mostra una caixa amb el text, després va apuntant "Prem una tecla per a +-- continuar" cap amunt fins una posició final, i espera una tecla. +function update_avis() + cls() + + color(COLOR_WHITE, COLOR_BLACK) + print("- AVIS -", 16, 3) + + color(COLOR_WHITE, COLOR_BLACK) + print("+------------------------------+", 3, 6) + print("| |", 3, 7) + print("| Port a la fantasy console |", 3, 8) + print("| ascii del joc original en |", 3, 9) + print("| Turbo Pascal de 1999, fet |", 3, 10) + print("| per Sergi Valor Martinez. |", 3, 11) + print("| |", 3, 12) + print("| Que sapigues que les tres |", 3, 13) + print("| fases son en bucle infinit. |", 3, 14) + print("| |", 3, 15) + print("+------------------------------+", 3, 16) + + -- Animació del missatge pujant des de fila 24 fins fila 19 (5 fil) + local fila_final = 19 + local pas = estat_t // 8 + local fila = 24 - pas + if fila < fila_final then fila = fila_final end + + if (estat_t // 6) % 2 == 0 then + color(COLOR_LIGHT_CYAN, COLOR_BLACK) + print("- Prem una tecla per a continuar -", 3, fila) + end + + -- Quan el missatge ja ha arribat a la posició final, accepta tecles + if fila == fila_final then + if btnp(KEY_SPACE) or btnp(KEY_RETURN) then + anar_a_fase(1) + return + end + for k = KEY_A, KEY_Z do + if btnp(k) then anar_a_fase(1); return end + end + end +end + -- ==================================================================== -- BUCLE PRINCIPAL -- ==================================================================== @@ -547,12 +637,14 @@ function init() init_malos() fase = 1 carregar_mapa(fase) + set_estat(ESTAT_AVIS) cls() end function update() estat_t = estat_t + 1 - if estat_joc == ESTAT_PLAYING then update_playing() + if estat_joc == ESTAT_AVIS then update_avis() + elseif estat_joc == ESTAT_PLAYING then update_playing() elseif estat_joc == ESTAT_MURIGUENT then update_muriguent() elseif estat_joc == ESTAT_GAMEOVER then update_gameover() elseif estat_joc == ESTAT_INTERFASE then update_interfase()