Fase 5: pantalles PASE, escapada, mossegada i pregunta S/N
This commit is contained in:
+174
-27
@@ -48,6 +48,19 @@ MS_POR_JIFFY = 20
|
|||||||
-- alterna 1,2 y solo se mueve cuando == 2 → 1 paso de perro cada 2 del jugador).
|
-- alterna 1,2 y solo se mueve cuando == 2 → 1 paso de perro cada 2 del jugador).
|
||||||
PERRO_RATIO = 2
|
PERRO_RATIO = 2
|
||||||
|
|
||||||
|
-- Duraciones de transición (ms)
|
||||||
|
MS_ESCAPE = 2500
|
||||||
|
MS_MORDIDO = 1500
|
||||||
|
MS_PREGUNTA_MIN = 600 -- antes de aceptar S/N
|
||||||
|
|
||||||
|
-- Estados de la máquina global
|
||||||
|
ESTADO_PASE = "pase"
|
||||||
|
ESTADO_JUEGO = "juego"
|
||||||
|
ESTADO_ESCAPE = "escape"
|
||||||
|
ESTADO_MORDIDO = "mordido"
|
||||||
|
ESTADO_PREGUNTA = "pregunta"
|
||||||
|
ESTADO_FIN = "fin"
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- PALETA (mapeo CPC firmware → CGA disponible)
|
-- PALETA (mapeo CPC firmware → CGA disponible)
|
||||||
-- Original: INK 0,0 (negro) / 1,26 (pastel) / 2,15 (blanco) /
|
-- Original: INK 0,0 (negro) / 1,26 (pastel) / 2,15 (blanco) /
|
||||||
@@ -234,6 +247,10 @@ robado = 0 -- joyas recogidas por el ladrón
|
|||||||
mensaje_msg = "" -- mensaje de la fila inferior (Choque, etc.)
|
mensaje_msg = "" -- mensaje de la fila inferior (Choque, etc.)
|
||||||
retardo = RETARDO_INI
|
retardo = RETARDO_INI
|
||||||
|
|
||||||
|
-- Máquina de estados
|
||||||
|
estado = ESTADO_PASE
|
||||||
|
estado_t0_ms = 0
|
||||||
|
|
||||||
-- Perro guardián
|
-- Perro guardián
|
||||||
perro = {
|
perro = {
|
||||||
activo = false, -- perro==1 del original
|
activo = false, -- perro==1 del original
|
||||||
@@ -702,6 +719,156 @@ function mover_jugador(xf, yf)
|
|||||||
tick_perro_post_jugador()
|
tick_perro_post_jugador()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- MÁQUINA DE ESTADOS
|
||||||
|
-- ============================================================
|
||||||
|
function set_estado(s)
|
||||||
|
estado = s
|
||||||
|
estado_t0_ms = time()
|
||||||
|
end
|
||||||
|
|
||||||
|
function tiempo_estado_ms() return time() - estado_t0_ms end
|
||||||
|
|
||||||
|
-- Reset completo del estado de partida (equivale al RUN del original).
|
||||||
|
function reset_partida()
|
||||||
|
init_mapa()
|
||||||
|
generar_objetos()
|
||||||
|
retardo = RETARDO_INI
|
||||||
|
mensaje_msg = ""
|
||||||
|
rm = 1
|
||||||
|
xp = 6
|
||||||
|
yp = 4
|
||||||
|
escapado = false
|
||||||
|
muerto = false
|
||||||
|
hombre_glifo = GL_LADRON
|
||||||
|
perro.activo = false
|
||||||
|
perro.pendiente = false
|
||||||
|
perro.paso = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ----- PANTALLA PASE (líneas 720-960 del original) -----
|
||||||
|
function update_pase()
|
||||||
|
pintar_fondo()
|
||||||
|
color(COL_LADRON, COL_FONDO)
|
||||||
|
print("- P A S E -", 11, 1)
|
||||||
|
color(COL_TEXTO, COL_FONDO)
|
||||||
|
print("Puertas y ventanas para escapar", 1, 3)
|
||||||
|
|
||||||
|
-- Leyenda de simbolos (líneas 840-930 del original)
|
||||||
|
color(COL_LADRON, COL_FONDO)
|
||||||
|
print(chr(GL_LADRON).." Usted, el ladron", 2, 6)
|
||||||
|
color(COL_PUERTA, COL_FONDO)
|
||||||
|
print(chr(GL_PUERTA_H)..chr(GL_PUERTA_V).." Puertas", 2, 8)
|
||||||
|
color(COL_CONMUT, COL_FONDO)
|
||||||
|
print(chr(GL_CONM_L_OFF)..chr(GL_CONM_R_OFF).." Luces apagadas", 2, 10)
|
||||||
|
print(chr(GL_CONM_L_ON) ..chr(GL_CONM_R_ON) .." Luces encendidas", 2, 11)
|
||||||
|
color(COL_VENTANA, COL_FONDO)
|
||||||
|
print(chr(GL_VENT_H)..chr(GL_VENT_V).." Ventanas", 2, 13)
|
||||||
|
color(COL_JOYA, COL_FONDO)
|
||||||
|
print(chr(GL_JOYA).." Piedras preciosas", 2, 15)
|
||||||
|
color(COL_OBSTACULO, COL_FONDO)
|
||||||
|
print(chr(GL_OBSTACULO).." Obstaculos", 2, 17)
|
||||||
|
color(COL_PERRO, COL_FONDO)
|
||||||
|
print(chr(GL_PERRO).." El perro", 2, 19)
|
||||||
|
|
||||||
|
if (cnt() // 30) % 2 == 0 then
|
||||||
|
color(COL_LADRON, COL_FONDO)
|
||||||
|
print("Pulsa ESPACIO para empezar", 3, 22)
|
||||||
|
end
|
||||||
|
|
||||||
|
if btnp(KEY_SPACE) then
|
||||||
|
reset_partida()
|
||||||
|
set_estado(ESTADO_JUEGO)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ----- JUEGO -----
|
||||||
|
function update_juego()
|
||||||
|
tick_perro_pendiente()
|
||||||
|
|
||||||
|
if (cnt() - ultimo_tic) >= TICS_JUGADOR then
|
||||||
|
local xf, yf = 0, 0
|
||||||
|
if btn(KEY_UP) then yf = -1
|
||||||
|
elseif btn(KEY_DOWN) then yf = 1 end
|
||||||
|
if btn(KEY_LEFT) then xf = -1
|
||||||
|
elseif btn(KEY_RIGHT) then xf = 1 end
|
||||||
|
if xf ~= 0 or yf ~= 0 then
|
||||||
|
mover_jugador(xf, yf)
|
||||||
|
ultimo_tic = cnt()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
pintar_fondo()
|
||||||
|
pintar_banner()
|
||||||
|
pintar_habitacion()
|
||||||
|
pintar_marcador()
|
||||||
|
pintar_msg()
|
||||||
|
|
||||||
|
if escapado then set_estado(ESTADO_ESCAPE) return end
|
||||||
|
if muerto then set_estado(ESTADO_MORDIDO) return end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ----- ESCAPE (líneas 1910-1970 del original) -----
|
||||||
|
function update_escape()
|
||||||
|
pintar_fondo()
|
||||||
|
color(COL_LADRON, COL_FONDO)
|
||||||
|
print("Usted ha escapado", 2, 3)
|
||||||
|
color(COL_TEXTO, COL_FONDO)
|
||||||
|
print("con", 7, 5)
|
||||||
|
if robado == joyas_total then
|
||||||
|
print("todas las", 7, 7)
|
||||||
|
end
|
||||||
|
color(COL_JOYA, COL_FONDO)
|
||||||
|
print(string.format("%2d", robado), 7, 7 + ((robado == joyas_total) and 2 or 0))
|
||||||
|
color(COL_LADRON, COL_FONDO)
|
||||||
|
print("joyas", 7, 9 + ((robado == joyas_total) and 2 or 0))
|
||||||
|
|
||||||
|
if tiempo_estado_ms() >= MS_ESCAPE then
|
||||||
|
set_estado(ESTADO_PREGUNTA)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ----- MORDIDO (línea 2660 del original) -----
|
||||||
|
function update_mordido()
|
||||||
|
-- Sigue mostrando el último frame del juego con "MORDIDO" encima
|
||||||
|
pintar_fondo()
|
||||||
|
pintar_banner()
|
||||||
|
pintar_habitacion()
|
||||||
|
pintar_marcador()
|
||||||
|
|
||||||
|
color(COL_MSG, COL_FONDO)
|
||||||
|
print(" MORDIDO ", 12, FILA_MSG)
|
||||||
|
|
||||||
|
if tiempo_estado_ms() >= MS_MORDIDO then
|
||||||
|
set_estado(ESTADO_PREGUNTA)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ----- PREGUNTA (líneas 240-300 del original) -----
|
||||||
|
function update_pregunta()
|
||||||
|
pintar_fondo()
|
||||||
|
color(COL_LADRON, COL_FONDO)
|
||||||
|
print("Quiere jugar", 4, 3)
|
||||||
|
print("otra vez?", 5, 5)
|
||||||
|
color(COL_JOYA, COL_FONDO)
|
||||||
|
print("S/N", 7, 7)
|
||||||
|
|
||||||
|
if tiempo_estado_ms() < MS_PREGUNTA_MIN then return end
|
||||||
|
if btnp(KEY_S) then
|
||||||
|
reset_partida()
|
||||||
|
set_estado(ESTADO_JUEGO)
|
||||||
|
elseif btnp(KEY_N) then
|
||||||
|
set_estado(ESTADO_FIN)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ----- FIN -----
|
||||||
|
function update_fin()
|
||||||
|
pintar_fondo()
|
||||||
|
color(COL_LADRON, COL_FONDO)
|
||||||
|
print("F I N", 13, 11)
|
||||||
|
end
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- BUCLE PRINCIPAL
|
-- BUCLE PRINCIPAL
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
@@ -723,36 +890,16 @@ function init()
|
|||||||
perro.activo = false
|
perro.activo = false
|
||||||
perro.pendiente = false
|
perro.pendiente = false
|
||||||
perro.paso = 0
|
perro.paso = 0
|
||||||
|
set_estado(ESTADO_PASE)
|
||||||
cls()
|
cls()
|
||||||
end
|
end
|
||||||
|
|
||||||
function update()
|
function update()
|
||||||
-- Movimiento del jugador (cursores). Fase 5 manejará escapado/muerto.
|
if estado == ESTADO_PASE then update_pase()
|
||||||
if escapado or muerto then
|
elseif estado == ESTADO_JUEGO then update_juego()
|
||||||
pintar_fondo()
|
elseif estado == ESTADO_ESCAPE then update_escape()
|
||||||
color(COL_TEXTO, COL_FONDO)
|
elseif estado == ESTADO_MORDIDO then update_mordido()
|
||||||
if escapado then print("ESCAPADO (Fase 5)", 1, 10) end
|
elseif estado == ESTADO_PREGUNTA then update_pregunta()
|
||||||
if muerto then print("MUERTO (Fase 5)", 1, 10) end
|
elseif estado == ESTADO_FIN then update_fin()
|
||||||
return
|
|
||||||
end
|
end
|
||||||
|
|
||||||
tick_perro_pendiente()
|
|
||||||
|
|
||||||
if (cnt() - ultimo_tic) >= TICS_JUGADOR then
|
|
||||||
local xf, yf = 0, 0
|
|
||||||
if btn(KEY_UP) then yf = -1
|
|
||||||
elseif btn(KEY_DOWN) then yf = 1 end
|
|
||||||
if btn(KEY_LEFT) then xf = -1
|
|
||||||
elseif btn(KEY_RIGHT) then xf = 1 end
|
|
||||||
if xf ~= 0 or yf ~= 0 then
|
|
||||||
mover_jugador(xf, yf)
|
|
||||||
ultimo_tic = cnt()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
pintar_fondo()
|
|
||||||
pintar_banner()
|
|
||||||
pintar_habitacion()
|
|
||||||
pintar_marcador()
|
|
||||||
pintar_msg()
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user