Fase 2: moviment del jugador entre habitacions
This commit is contained in:
+118
-21
@@ -21,6 +21,9 @@ FILA_MSG = 23 -- mensajes "Choque", "MORDIDO"
|
|||||||
AREA_Y0 = 1 -- primera fila donde se pinta la habitación
|
AREA_Y0 = 1 -- primera fila donde se pinta la habitación
|
||||||
AREA_Y1 = 22 -- última fila
|
AREA_Y1 = 22 -- última fila
|
||||||
|
|
||||||
|
-- Ritmo del movimiento del jugador (frames entre pasos)
|
||||||
|
TICS_JUGADOR = 4
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- 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) /
|
||||||
@@ -195,6 +198,9 @@ rm = 1 -- habitación actual (variable rm del original)
|
|||||||
xp, yp = 6, 4 -- posición del ladrón
|
xp, yp = 6, 4 -- posición del ladrón
|
||||||
hombre_glifo = GL_LADRON
|
hombre_glifo = GL_LADRON
|
||||||
mapa = {} -- mapa[hab][x][y] = tipo de celda
|
mapa = {} -- mapa[hab][x][y] = tipo de celda
|
||||||
|
ultimo_tic = 0 -- contador de frames para temporizar el movimiento
|
||||||
|
escapado = false -- se activa al alcanzar dir=0 (Fase 5 muestra el final)
|
||||||
|
muerto = false -- se activa al ser mordido por el perro (Fase 4)
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- CONSTRUCCIÓN DEL MAPA LÓGICO
|
-- CONSTRUCCIÓN DEL MAPA LÓGICO
|
||||||
@@ -354,8 +360,96 @@ function pintar_habitacion()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- BUCLE PRINCIPAL — FASE 1
|
-- MOVIMIENTO Y CAMBIO DE HABITACIÓN
|
||||||
-- Solo render estático. Teclas 1..5 cambian habitación visible.
|
-- Reproducción de la lógica de las líneas 1520-1900 del original.
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
-- Aplica la nueva posición del ladrón tras cambiar a otra habitación,
|
||||||
|
-- según la dirección por la que ha entrado (línea 1810-1840 original).
|
||||||
|
function aplicar_dir(dir)
|
||||||
|
local hab = HABITACIONES[rm]
|
||||||
|
if dir == 1 then xp = 6; yp = hab.maxy
|
||||||
|
elseif dir == 2 then xp = 6; yp = hab.miny
|
||||||
|
elseif dir == 3 then xp = hab.minx; yp = 13
|
||||||
|
elseif dir == 4 then xp = hab.maxx; yp = 13
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Resuelve el cambio de habitación dada una dirección (1=N, 2=S, 3=E, 4=O).
|
||||||
|
-- dir(rm, dir) = -1 → bloqueado; = 0 → escapar; = n → ir a habitación n.
|
||||||
|
function cambiar_a_dir(dir)
|
||||||
|
local destino = HABITACIONES[rm].dir[dir]
|
||||||
|
if destino == -1 then return end
|
||||||
|
if destino == 0 then
|
||||||
|
escapado = true
|
||||||
|
return
|
||||||
|
end
|
||||||
|
rm = destino
|
||||||
|
aplicar_dir(dir)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Dirección estándar según el vector de movimiento (xf, yf).
|
||||||
|
-- Original: línea 1770-1780 — prioridad al eje vertical si yf != 0.
|
||||||
|
function dir_de_movimiento(xf, yf)
|
||||||
|
local dir
|
||||||
|
if xf < 0 then dir = 4
|
||||||
|
elseif xf > 0 then dir = 3 end
|
||||||
|
if yf < 0 then dir = 1
|
||||||
|
elseif yf > 0 then dir = 2 end
|
||||||
|
return dir
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Parche del Pasillo para ventanas H (líneas 1860-1900 del original):
|
||||||
|
-- según xp (no xf/yf), decide la dirección de salida.
|
||||||
|
function dir_vent_h()
|
||||||
|
if xp > 5 and xp < 8 then
|
||||||
|
if yp > 13 then return 2 else return 1 end
|
||||||
|
else
|
||||||
|
if xp < 6 then return 4 else return 3 end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Intenta mover el ladrón en (xf, yf). Replica la cadena gol del
|
||||||
|
-- original (línea 1670 y siguientes).
|
||||||
|
function mover_jugador(xf, yf)
|
||||||
|
if xf == 0 and yf == 0 then return end
|
||||||
|
local nx, ny = xp + xf, yp + yf
|
||||||
|
local t = mapa[rm][nx][ny]
|
||||||
|
|
||||||
|
-- Conmutador (gol=1..4): no se mueve, no hace nada en Fase 2 (Fase 3 toggle)
|
||||||
|
if t == T_CONM_L or t == T_CONM_R then return end
|
||||||
|
|
||||||
|
-- Puerta H o V (gol=5,6): cambio de habitación con dirección estándar
|
||||||
|
if t == T_PUERTA_H or t == T_PUERTA_V then
|
||||||
|
local d = dir_de_movimiento(xf, yf)
|
||||||
|
if d then cambiar_a_dir(d) end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Ventana H (gol=7): parche del Pasillo
|
||||||
|
if t == T_VENT_H then
|
||||||
|
cambiar_a_dir(dir_vent_h())
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Ventana V (gol=8): escape directo (línea 1910 del original)
|
||||||
|
if t == T_VENT_V then
|
||||||
|
escapado = true
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Pared: bloqueada
|
||||||
|
if t == T_PARED then return end
|
||||||
|
|
||||||
|
-- Joya, obstáculo, perro: Fase 3/4
|
||||||
|
if t == T_JOYA or t == T_OBSTACULO or t == T_PERRO then return end
|
||||||
|
|
||||||
|
-- Vacío: mover
|
||||||
|
xp, yp = nx, ny
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- BUCLE PRINCIPAL
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
function init()
|
function init()
|
||||||
mode(MODO)
|
mode(MODO)
|
||||||
@@ -364,33 +458,36 @@ function init()
|
|||||||
definir_glifos()
|
definir_glifos()
|
||||||
init_mapa()
|
init_mapa()
|
||||||
rm = 1
|
rm = 1
|
||||||
-- Posición inicial del ladrón en cada habitación (centrada-ish)
|
xp = 6
|
||||||
xp = flr((HABITACIONES[rm].minx + HABITACIONES[rm].maxx) / 2)
|
yp = 4
|
||||||
yp = HABITACIONES[rm].miny + 2
|
escapado = false
|
||||||
|
muerto = false
|
||||||
cls()
|
cls()
|
||||||
end
|
end
|
||||||
|
|
||||||
function update()
|
function update()
|
||||||
-- FASE 1: navegación manual entre habitaciones para verificar
|
-- Movimiento del jugador (cursores). Fase 5 manejará escapado/muerto.
|
||||||
if btnp(KEY_1) then rm = 1 end
|
if escapado or muerto then
|
||||||
if btnp(KEY_2) then rm = 2 end
|
pintar_fondo()
|
||||||
if btnp(KEY_3) then rm = 3 end
|
color(COL_TEXTO, COL_FONDO)
|
||||||
if btnp(KEY_4) then rm = 4 end
|
if escapado then print("ESCAPADO (Fase 5)", 1, 10) end
|
||||||
if btnp(KEY_5) then rm = 5 end
|
if muerto then print("MUERTO (Fase 5)", 1, 10) end
|
||||||
-- Tecla L para alternar la luz de la habitación actual (debug)
|
return
|
||||||
if btnp(KEY_L) then HABITACIONES[rm].luz = not HABITACIONES[rm].luz end
|
end
|
||||||
|
|
||||||
-- Reposicionar al ladrón al cambiar de habitación
|
if (cnt() - ultimo_tic) >= TICS_JUGADOR then
|
||||||
local hab = HABITACIONES[rm]
|
local xf, yf = 0, 0
|
||||||
if xp < hab.minx or xp > hab.maxx or yp < hab.miny or yp > hab.maxy then
|
if btn(KEY_UP) then yf = -1
|
||||||
xp = flr((hab.minx + hab.maxx) / 2)
|
elseif btn(KEY_DOWN) then yf = 1 end
|
||||||
yp = hab.miny + 2
|
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
|
end
|
||||||
|
|
||||||
pintar_fondo()
|
pintar_fondo()
|
||||||
pintar_banner()
|
pintar_banner()
|
||||||
pintar_habitacion()
|
pintar_habitacion()
|
||||||
|
|
||||||
color(COL_TEXTO, COL_FONDO)
|
|
||||||
print("1..5 hab. L luz", 1, FILA_MSG)
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user