Pantalla d'avis, sweep de neteja, jingle i diagrama de tecles

This commit is contained in:
2026-05-16 08:53:38 +02:00
parent cff94ff255
commit d8883372b0
+110 -18
View File
@@ -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()