Fase 3: joies, obstacles, conmutadors i llums
This commit is contained in:
+171
-6
@@ -24,6 +24,22 @@ AREA_Y1 = 22 -- última fila
|
|||||||
-- Ritmo del movimiento del jugador (frames entre pasos)
|
-- Ritmo del movimiento del jugador (frames entre pasos)
|
||||||
TICS_JUGADOR = 4
|
TICS_JUGADOR = 4
|
||||||
|
|
||||||
|
-- Generación procedural (líneas 1000-1170 del original):
|
||||||
|
-- joyar = INT(RND*8) + 2 → 2..9 joyas por habitación
|
||||||
|
-- objr = INT(RND*10) + 5 → 5..14 obstáculos por habitación
|
||||||
|
JOYAS_MIN = 2
|
||||||
|
JOYAS_RND = 8
|
||||||
|
OBJ_MIN = 5
|
||||||
|
OBJ_RND = 10
|
||||||
|
|
||||||
|
-- Retardo del perro (línea 60): empieza en 200, cada choque ruidoso resta 50,
|
||||||
|
-- mínimo 50. La activación del perro la maneja la Fase 4.
|
||||||
|
RETARDO_INI = 200
|
||||||
|
RETARDO_MIN = 50
|
||||||
|
RETARDO_STEP = 50
|
||||||
|
RUIDO_RND = 15
|
||||||
|
RUIDO_UMBRAL = 10
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- 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) /
|
||||||
@@ -202,6 +218,14 @@ ultimo_tic = 0 -- contador de frames para temporizar el movimiento
|
|||||||
escapado = false -- se activa al alcanzar dir=0 (Fase 5 muestra el final)
|
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)
|
muerto = false -- se activa al ser mordido por el perro (Fase 4)
|
||||||
|
|
||||||
|
-- Joyas y obstáculos (listas paralelas al mapa por habitación)
|
||||||
|
joyas_lista = {} -- joyas_lista[rm] = { {x,y}, ... }
|
||||||
|
obj_lista = {} -- obj_lista[rm] = { {x,y}, ... }
|
||||||
|
joyas_total = 0 -- total inicial (suma de las 5 habitaciones)
|
||||||
|
robado = 0 -- joyas recogidas por el ladrón
|
||||||
|
mensaje_msg = "" -- mensaje de la fila inferior (Choque, etc.)
|
||||||
|
retardo = RETARDO_INI
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- CONSTRUCCIÓN DEL MAPA LÓGICO
|
-- CONSTRUCCIÓN DEL MAPA LÓGICO
|
||||||
-- Por habitación se construye una matriz [x][y] con el tipo de
|
-- Por habitación se construye una matriz [x][y] con el tipo de
|
||||||
@@ -336,29 +360,144 @@ function pintar_habitacion()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Paredes y elementos
|
-- Paredes y elementos. Las joyas y obstáculos solo se ven con la luz
|
||||||
|
-- encendida (línea 1280 del original: INK 7,10 ↔ INK 7,0).
|
||||||
for y = hab.miny - 1, hab.maxy + 1 do
|
for y = hab.miny - 1, hab.maxy + 1 do
|
||||||
for x = hab.minx - 1, hab.maxx + 1 do
|
for x = hab.minx - 1, hab.maxx + 1 do
|
||||||
local t = mapa[rm][x][y]
|
local t = mapa[rm][x][y]
|
||||||
if t ~= T_VACIO then
|
if t ~= T_VACIO then
|
||||||
|
local oculto = (not hab.luz) and (t == T_JOYA or t == T_OBSTACULO)
|
||||||
|
if not oculto then
|
||||||
local on = false
|
local on = false
|
||||||
if t == T_CONM_L or t == T_CONM_R then
|
if t == T_CONM_L or t == T_CONM_R then
|
||||||
on = conm_estado(hab, x, y)
|
on = conm_estado(hab, x, y)
|
||||||
end
|
end
|
||||||
local g = glifo_de(t, on)
|
local g = glifo_de(t, on)
|
||||||
if g then
|
if g then
|
||||||
color(color_de(t), COL_FONDO)
|
local bg = (t == T_JOYA or t == T_OBSTACULO) and paper or COL_FONDO
|
||||||
|
color(color_de(t), bg)
|
||||||
print(chr(g), x + off_x, y + off_y)
|
print(chr(g), x + off_x, y + off_y)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- El ladrón
|
-- El ladrón
|
||||||
color(COL_LADRON, paper)
|
color(COL_LADRON, paper)
|
||||||
print(chr(hombre_glifo), xp + off_x, yp + off_y)
|
print(chr(hombre_glifo), xp + off_x, yp + off_y)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Marcador lateral de joyas robadas: una marca vertical por joya, replicando
|
||||||
|
-- el "MOVE 400,150+(robado*2):DRAW 555,150+(robado*2)" del original.
|
||||||
|
function pintar_marcador()
|
||||||
|
color(COL_JOYA, COL_FONDO)
|
||||||
|
print("Joyas", 26, 1)
|
||||||
|
print(string.format("%02d", robado), 27, 2)
|
||||||
|
for i = 1, robado do
|
||||||
|
local y = AREA_Y1 - (i - 1)
|
||||||
|
if y >= 4 then
|
||||||
|
print(chr(154), 28, y)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function pintar_msg()
|
||||||
|
if mensaje_msg ~= "" then
|
||||||
|
color(COL_MSG, COL_FONDO)
|
||||||
|
print(mensaje_msg, 4, FILA_MSG)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- GENERACIÓN PROCEDURAL DE JOYAS Y OBSTÁCULOS
|
||||||
|
-- Líneas 980-1170 del original. Las posiciones se eligen al
|
||||||
|
-- azar dentro del interior, sin comprobar conflictos (fiel al
|
||||||
|
-- original — una joya/obstáculo puede caer encima de otra).
|
||||||
|
-- ============================================================
|
||||||
|
function generar_objetos()
|
||||||
|
joyas_total = 0
|
||||||
|
robado = 0
|
||||||
|
joyas_lista = {}
|
||||||
|
obj_lista = {}
|
||||||
|
for id, hab in pairs(HABITACIONES) do
|
||||||
|
joyas_lista[id] = {}
|
||||||
|
obj_lista[id] = {}
|
||||||
|
local nj = rnd(JOYAS_RND) + JOYAS_MIN
|
||||||
|
local no = rnd(OBJ_RND) + OBJ_MIN
|
||||||
|
for i = 1, nj do
|
||||||
|
local x = rnd(hab.maxx - hab.minx + 1) + hab.minx
|
||||||
|
local y = rnd(hab.maxy - hab.miny + 1) + hab.miny
|
||||||
|
joyas_lista[id][#joyas_lista[id] + 1] = { x=x, y=y }
|
||||||
|
mapa[id][x][y] = T_JOYA
|
||||||
|
joyas_total = joyas_total + 1
|
||||||
|
end
|
||||||
|
for i = 1, no do
|
||||||
|
local x = rnd(hab.maxx - hab.minx + 1) + hab.minx
|
||||||
|
local y = rnd(hab.maxy - hab.miny + 1) + hab.miny
|
||||||
|
obj_lista[id][#obj_lista[id] + 1] = { x=x, y=y }
|
||||||
|
if mapa[id][x][y] ~= T_JOYA then
|
||||||
|
mapa[id][x][y] = T_OBSTACULO
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- TOGGLE DE CONMUTADOR Y LUZ (líneas 1700-1740 del original)
|
||||||
|
-- ============================================================
|
||||||
|
function toggle_conmutador(x, y)
|
||||||
|
local hab = HABITACIONES[rm]
|
||||||
|
for _, e in ipairs(hab.elementos) do
|
||||||
|
if e.tipo == "conm" and e.x == x and e.y == y then
|
||||||
|
e.on = not e.on
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hab.luz = not hab.luz -- línea 1730: luces(rm) XOR 1
|
||||||
|
sfx_conm()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- RECOGIDA DE JOYAS (líneas 1980-2090 del original)
|
||||||
|
-- El bucle recoge TODAS las joyas que estén en (x,y) — fiel al
|
||||||
|
-- "GOTO 1990" del original.
|
||||||
|
-- ============================================================
|
||||||
|
function recoger_joyas_en(x, y)
|
||||||
|
local i = 1
|
||||||
|
while i <= #joyas_lista[rm] do
|
||||||
|
local j = joyas_lista[rm][i]
|
||||||
|
if j.x == x and j.y == y then
|
||||||
|
table.remove(joyas_lista[rm], i)
|
||||||
|
robado = robado + 1
|
||||||
|
sfx_joya()
|
||||||
|
else
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
mapa[rm][x][y] = T_VACIO
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- CHOQUE CONTRA OBSTÁCULO (líneas 2100-2170 del original)
|
||||||
|
-- ============================================================
|
||||||
|
function chocar_obstaculo()
|
||||||
|
local ruido = rnd(RUIDO_RND)
|
||||||
|
sfx_obstaculo(ruido)
|
||||||
|
mensaje_msg = "Choque"
|
||||||
|
if ruido >= RUIDO_UMBRAL and retardo > RETARDO_MIN then
|
||||||
|
retardo = retardo - RETARDO_STEP
|
||||||
|
-- La activación del perro en sí la maneja la Fase 4.
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- SFX
|
||||||
|
-- ============================================================
|
||||||
|
function sfx_joya() sound(2000, 6) end
|
||||||
|
function sfx_obstaculo(r) sound(3000, 5 + r) end
|
||||||
|
function sfx_conm() sound(800, 3) end
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- MOVIMIENTO Y CAMBIO DE HABITACIÓN
|
-- MOVIMIENTO Y CAMBIO DE HABITACIÓN
|
||||||
-- Reproducción de la lógica de las líneas 1520-1900 del original.
|
-- Reproducción de la lógica de las líneas 1520-1900 del original.
|
||||||
@@ -416,8 +555,11 @@ function mover_jugador(xf, yf)
|
|||||||
local nx, ny = xp + xf, yp + yf
|
local nx, ny = xp + xf, yp + yf
|
||||||
local t = mapa[rm][nx][ny]
|
local t = mapa[rm][nx][ny]
|
||||||
|
|
||||||
-- Conmutador (gol=1..4): no se mueve, no hace nada en Fase 2 (Fase 3 toggle)
|
-- Conmutador (gol=1..4): toggle luz, no se mueve
|
||||||
if t == T_CONM_L or t == T_CONM_R then return end
|
if t == T_CONM_L or t == T_CONM_R then
|
||||||
|
toggle_conmutador(nx, ny)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
-- Puerta H o V (gol=5,6): cambio de habitación con dirección estándar
|
-- 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
|
if t == T_PUERTA_H or t == T_PUERTA_V then
|
||||||
@@ -441,11 +583,29 @@ function mover_jugador(xf, yf)
|
|||||||
-- Pared: bloqueada
|
-- Pared: bloqueada
|
||||||
if t == T_PARED then return end
|
if t == T_PARED then return end
|
||||||
|
|
||||||
-- Joya, obstáculo, perro: Fase 3/4
|
-- Joya (gol=9): mover y recoger
|
||||||
if t == T_JOYA or t == T_OBSTACULO or t == T_PERRO then return end
|
if t == T_JOYA then
|
||||||
|
xp, yp = nx, ny
|
||||||
|
recoger_joyas_en(nx, ny)
|
||||||
|
mensaje_msg = ""
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Obstáculo (gol=10): no mueve, ruido
|
||||||
|
if t == T_OBSTACULO then
|
||||||
|
chocar_obstaculo()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Perro (gol=11): mordido (Fase 4 implementa la consecuencia)
|
||||||
|
if t == T_PERRO then
|
||||||
|
muerto = true
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
-- Vacío: mover
|
-- Vacío: mover
|
||||||
xp, yp = nx, ny
|
xp, yp = nx, ny
|
||||||
|
mensaje_msg = ""
|
||||||
end
|
end
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
@@ -457,6 +617,9 @@ function init()
|
|||||||
color(COL_TEXTO, COL_FONDO)
|
color(COL_TEXTO, COL_FONDO)
|
||||||
definir_glifos()
|
definir_glifos()
|
||||||
init_mapa()
|
init_mapa()
|
||||||
|
generar_objetos()
|
||||||
|
retardo = RETARDO_INI
|
||||||
|
mensaje_msg = ""
|
||||||
rm = 1
|
rm = 1
|
||||||
xp = 6
|
xp = 6
|
||||||
yp = 4
|
yp = 4
|
||||||
@@ -490,4 +653,6 @@ function update()
|
|||||||
pintar_fondo()
|
pintar_fondo()
|
||||||
pintar_banner()
|
pintar_banner()
|
||||||
pintar_habitacion()
|
pintar_habitacion()
|
||||||
|
pintar_marcador()
|
||||||
|
pintar_msg()
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user