Multifase amb transicions i atalls de debug

This commit is contained in:
2026-05-16 08:42:53 +02:00
parent 48d6ec2c90
commit cff94ff255
3 changed files with 71 additions and 25 deletions
+1
View File
@@ -0,0 +1 @@
アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアアアアアアアアアアアロアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア
+1
View File
@@ -0,0 +1 @@
アアアアアアアアアアアアアアアアアアアアアアアアアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロアロアロロロロロロロロロロロアアロロロロロロロロロアロアロロロロロロロロロロロアアロロロロロロロロアアロアアロロロロロロロロロロアアロロロロロロロロアアロアアロロロロロロロロロロアアロロロロロロロアアアロアアアロロロロロロロロロアアロロロロロロロアアアロアアアロロロロロロロロロアアアアアロアアアアアアロアアアアアアロロアアロロアアアアアロアアアアアアロアアアアアアロロアアロロアアロロロロロロロアアアロアアアロロロロロロロロロアアロロロロロロロロアアロアアロロロロロロロロロロアアロロロロロロロロアアロアアロロロロロロロロロロアアロロロロロロロロロアロアロロロロロロロロロロロアアロロロロロロロロロアロアロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアロロロロロロロロロロロロロロロロロロロロロロロアアアアアアアアアアアアロアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア
+69 -25
View File
@@ -1,13 +1,9 @@
-- Pepe el Pintor — port a ascii/Lua del joc original en Turbo Pascal -- Pepe el Pintor — port a ascii/Lua del joc original en Turbo Pascal
-- (Sergi Valor Martínez, 1999). Base: PINTOR3.PAS. -- (Sergi Valor Martínez, 1999). Base: PINTOR3.PAS.
-- --
-- ITER 2: motor base + enemics + vides. -- ITER 3: multifase. 3 mapes (rect xicotet, creu+rombe, rect gran) amb
-- - Fase única (la 3 = rectangle gran) -- transició "ENHORABONA!" entre fases. En acabar la fase 3, loop a la fase 1
-- - O P Q A per a moure, pinta al pas, gasta el pot -- mantenint el flux infinit del Pascal original.
-- - Recàrrega al tornar al pot (fidel al Pascal: sound(i*10))
-- - 3 enemics amb spawn diferit per llindar de blocs pintats
-- - Moviment IA dels enemics fidel a moure_malos (random eix + perseguir)
-- - 5 vides, animació de mort, game over, victòria
-- ==================================================================== -- ====================================================================
-- CONSTANTS -- CONSTANTS
@@ -32,10 +28,12 @@ TICS_OMPLIR = 3 -- frames entre +1 de pot al recarregar
NUM_MALOS = 3 NUM_MALOS = 3
VIDES_INI = 5 VIDES_INI = 5
NUM_FASES = 3
-- Llindars d'aparició dels enemics (proporcionals al PINTOR3 escalat als -- Llindars d'aparició dels enemics expressats com a *fracció* del total
-- nostres ~829 blocs). Apareixen quan total_blocs baixa per sota d'aquests. -- inicial de la fase. PINTOR3 tenia 1000/700/500 blocs sobre ~1320 → 76% /
BLOCS_SPAWN = { 750, 520, 370 } -- 53% / 38%. Apareixen quan total_blocs baixa per sota.
SPAWN_FRAC = { 0.76, 0.53, 0.38 }
-- Animació de mort: 10000 Hz → 1000 Hz, restant 250 cada pas -- Animació de mort: 10000 Hz → 1000 Hz, restant 250 cada pas
MORT_FREQ_INI = 10000 MORT_FREQ_INI = 10000
@@ -47,7 +45,8 @@ MORT_FRAMES = 36 -- ~600 ms d'animació de mort
ESTAT_PLAYING = "playing" ESTAT_PLAYING = "playing"
ESTAT_MURIGUENT = "muriguent" ESTAT_MURIGUENT = "muriguent"
ESTAT_GAMEOVER = "gameover" ESTAT_GAMEOVER = "gameover"
ESTAT_VICTORIA = "victoria" ESTAT_INTERFASE = "interfase" -- "ENHORABONA!" entre fases (fidel al Pascal)
INTERFASE_FRAMES = 240 -- ~4 segons (l'original feia delay(5000) = 5s)
-- ==================================================================== -- ====================================================================
-- ESTAT GLOBAL -- ESTAT GLOBAL
@@ -62,6 +61,9 @@ omplir_max = 0
malos = {} -- { {x, y, viu=bool, aparegut=bool}, ... } malos = {} -- { {x, y, viu=bool, aparegut=bool}, ... }
vides = VIDES_INI vides = VIDES_INI
fase = 1 -- 1..NUM_FASES, loop al final
total_inicial = 0 -- valor de total_blocs al començar la fase (per als llindars)
truco = false -- invulnerabilitat (mode debug, l'original ho tenia comentat amb tecla I)
estat_joc = ESTAT_PLAYING estat_joc = ESTAT_PLAYING
estat_t = 0 -- contador de frames dins de l'estat actual estat_t = 0 -- contador de frames dins de l'estat actual
@@ -131,6 +133,7 @@ function carregar_mapa(num)
-- La cel·la del pot no es pinta: ja "pintada" per a la condició de victòria -- La cel·la del pot no es pinta: ja "pintada" per a la condició de victòria
mapa[PEPE_INI_X][PEPE_INI_Y].pintat = true mapa[PEPE_INI_X][PEPE_INI_Y].pintat = true
total_blocs = total_blocs - 1 total_blocs = total_blocs - 1
total_inicial = total_blocs -- per a calcular llindars d'spawn
end end
function pintar_mapa() function pintar_mapa()
@@ -180,7 +183,7 @@ function pintar_malos()
end end
end end
-- HUD: pintura, blocs restants, vides (com a ☻), controls -- HUD: pintura, blocs restants, vides (com a ☻), fase, controls
function pintar_hud() function pintar_hud()
color(COLOR_LIGHT_GRAY, COLOR_BLUE) color(COLOR_LIGHT_GRAY, COLOR_BLUE)
local blank = " " local blank = " "
@@ -197,8 +200,14 @@ function pintar_hud()
print(chr(PEPE_PLE), 32 + i, 26) print(chr(PEPE_PLE), 32 + i, 26)
end end
color(COLOR_LIGHT_GREEN, COLOR_BLUE)
print("FASE "..tostr(fase), 1, 28)
color(COLOR_LIGHT_CYAN, COLOR_BLUE) color(COLOR_LIGHT_CYAN, COLOR_BLUE)
print("O P Q A: moure", 1, 28) print("O P Q A: moure", 12, 28)
if truco then
color(COLOR_WHITE, COLOR_RED)
print("INVULN", 30, 28)
end
end end
-- ==================================================================== -- ====================================================================
@@ -302,12 +311,13 @@ function jingle_malo()
play("l0o3cdefgab>cl0o3cdefgab>c") play("l0o3cdefgab>cl0o3cdefgab>c")
end end
-- Check spawn: si total_blocs ha baixat per sota del llindar i el malo no -- Check spawn: si total_blocs ha baixat per sota del llindar proporcional al
-- ha aparegut encara, el fem aparèixer. -- total inicial de la fase, i el malo encara no ha aparegut, el fem aparèixer.
function check_spawn() function check_spawn()
for i = 1, NUM_MALOS do for i = 1, NUM_MALOS do
local m = malos[i] local m = malos[i]
if not m.aparegut and total_blocs <= BLOCS_SPAWN[i] then local llindar = flr(total_inicial * SPAWN_FRAC[i])
if not m.aparegut and total_blocs <= llindar then
m.x, m.y = naiximent() m.x, m.y = naiximent()
m.viu = true m.viu = true
m.aparegut = true m.aparegut = true
@@ -381,6 +391,7 @@ function set_estat(nou)
end end
function mort_pepe() function mort_pepe()
if truco then return end -- invulnerabilitat de debug
vides = vides - 1 vides = vides - 1
set_estat(ESTAT_MURIGUENT) set_estat(ESTAT_MURIGUENT)
end end
@@ -389,15 +400,38 @@ function reset_partida()
pot = POT_MAX pot = POT_MAX
total_blocs = 0 total_blocs = 0
vides = VIDES_INI vides = VIDES_INI
fase = 1
omplint = false omplint = false
pepe.x, pepe.y = PEPE_INI_X, PEPE_INI_Y pepe.x, pepe.y = PEPE_INI_X, PEPE_INI_Y
pepe.pinta = true pepe.pinta = true
init_malos() init_malos()
carregar_mapa(3) carregar_mapa(fase)
reset_input() reset_input()
set_estat(ESTAT_PLAYING) set_estat(ESTAT_PLAYING)
end end
-- Carrega una fase concreta (reinicia vides i pot, ja siga per la transició
-- normal o per l'atall de debug). Si n > NUM_FASES, loop a 1.
function anar_a_fase(n)
if n > NUM_FASES then n = 1 end
if n < 1 then n = NUM_FASES end
fase = n
vides = VIDES_INI
pot = POT_MAX
omplint = false
pepe.x, pepe.y = PEPE_INI_X, PEPE_INI_Y
pepe.pinta = true
init_malos()
carregar_mapa(fase)
reset_input()
set_estat(ESTAT_PLAYING)
end
-- Avança a la fase següent (fidel al PINTOR3: nfase++ i si > 3, loop a 1).
function avancar_fase()
anar_a_fase(fase + 1)
end
-- Respawn després de mort (sense reset complet, sols Pepe a casa i pot ple) -- Respawn després de mort (sense reset complet, sols Pepe a casa i pot ple)
function respawn_pepe() function respawn_pepe()
pepe.x, pepe.y = PEPE_INI_X, PEPE_INI_Y pepe.x, pepe.y = PEPE_INI_X, PEPE_INI_Y
@@ -413,6 +447,13 @@ end
function update_playing() function update_playing()
sample_input() sample_input()
-- Atalls de debug: 1/2/3 = salta a fase, I = toggle invulnerable
if btnp(KEY_1) then anar_a_fase(1); return
elseif btnp(KEY_2) then anar_a_fase(2); return
elseif btnp(KEY_3) then anar_a_fase(3); return
end
if btnp(KEY_I) then truco = not truco end
if omplint and (cnt() % TICS_OMPLIR) == 0 then tic_omplir() end if omplint and (cnt() % TICS_OMPLIR) == 0 then tic_omplir() end
if not omplint and (cnt() % TICS_MOVIMENT) == 0 then if not omplint and (cnt() % TICS_MOVIMENT) == 0 then
@@ -425,7 +466,7 @@ function update_playing()
reset_input() reset_input()
if total_blocs <= 0 then if total_blocs <= 0 then
set_estat(ESTAT_VICTORIA) set_estat(ESTAT_INTERFASE)
play("l3o4ceg>c") play("l3o4ceg>c")
return return
end end
@@ -478,19 +519,21 @@ function update_gameover()
end end
end end
function update_victoria() -- Transició entre fases: ENHORABONA! parpadejant, després passa a la fase
-- següent automàticament (fidel al delay(5000) del PINTOR3).
function update_interfase()
cls() cls()
pintar_mapa() pintar_mapa()
pintar_pot() pintar_pot()
pintar_pepe() pintar_pepe()
pintar_hud() pintar_hud()
if (estat_t // 10) % 2 == 0 then if (estat_t // 12) % 2 == 0 then
color(COLOR_GREEN, COLOR_BLACK) color(COLOR_LIGHT_GREEN, COLOR_BLACK)
print("ENHORABONA!", 14, 11) print("ENHORABONA!", 14, 11)
end end
if estat_t > 180 and btnp(KEY_SPACE) then if estat_t >= INTERFASE_FRAMES then
reset_partida() avancar_fase()
end end
end end
@@ -502,7 +545,8 @@ function init()
border(COLOR_BLUE) border(COLOR_BLUE)
definir_glifs() definir_glifs()
init_malos() init_malos()
carregar_mapa(3) fase = 1
carregar_mapa(fase)
cls() cls()
end end
@@ -511,6 +555,6 @@ function update()
if estat_joc == ESTAT_PLAYING then update_playing() if estat_joc == ESTAT_PLAYING then update_playing()
elseif estat_joc == ESTAT_MURIGUENT then update_muriguent() elseif estat_joc == ESTAT_MURIGUENT then update_muriguent()
elseif estat_joc == ESTAT_GAMEOVER then update_gameover() elseif estat_joc == ESTAT_GAMEOVER then update_gameover()
elseif estat_joc == ESTAT_VICTORIA then update_victoria() elseif estat_joc == ESTAT_INTERFASE then update_interfase()
end end
end end