Pantalla d'avis, sweep de neteja, jingle i diagrama de tecles
This commit is contained in:
+110
-18
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user