Files
miniascii_games/3d_monster_jail/3d_monster_jail.lua

260 lines
6.3 KiB
Lua

laberinto = {}
primera_fila = 2
ultima_fila = 28
primera_columna = 1
ultima_columna = 38
jugador = {
x = primera_columna,
y = primera_fila,
velocitat = 0
}
malos = {{
x = 0,
y = 0,
velocitat = 0,
dx = -1,
dy = 0
}, {
x = 0,
y = 0,
velocitat = 0,
dx = 0,
dy = 0
}, {
x = 0,
y = 0,
velocitat = 0,
dx = 0,
dy = 0
}, {
x = 0,
y = 0,
velocitat = 0,
dx = 0,
dy = 0
}, {
x = 0,
y = 0,
velocitat = 0,
dx = 0,
dy = 0
}}
rellotge = 0
num_malos = 1
function init()
mode(1)
color(10, 15, 15)
cls()
crea_laberinto()
pinta_laberinto()
crea_malos()
-- play("o4v5l1crcl4dcferl1crcl4dcgfr")
-- print("hola",0,0)
end
function update()
rellotge = rellotge + 1
mou_jugador()
mou_malos()
pinta_laberinto()
pinta_jugador()
pinta_malos()
print(malos[1].dx, 0, 0)
print(malos[1].dy, 4, 0)
end
function crea_laberinto()
-- genera el laberinto
local longitud, inicio
for i = 0, 1199 do
-- plena tot de murs a partir de la primera_fila-1
if i < ((primera_fila - 1) * 40) then
laberinto[i] = 0x20
else
laberinto[i] = 0x8F
end
end
-- posa cami en la primera i última fila
for i = primera_columna, ultima_columna do
laberinto[(40 * primera_fila) + i] = 0x20
laberinto[(40 * ultima_fila) + i] = 0x20
end
-- posa cami en la primera i última columna
for i = primera_fila, ultima_fila do
laberinto[(40 * i) + primera_columna] = 0x20
laberinto[(40 * i) + ultima_columna] = 0x20
end
-- crea filas aleatories
local fila = primera_fila
while fila < ultima_fila - 1 do
if rnd(10) % 10 > 4 then
-- 60% de probabilitat de pintar la fila sencera
for j = primera_columna, ultima_columna do
laberinto[(40 * fila) + j] = 0x20
end
else
-- 40% de probabilitat de pintar sols un segment
longitud = max(15, rnd(ultima_columna - primera_columna) + 1)
inicio = rnd(ultima_columna - longitud) + primera_columna
for j = 1, longitud do
laberinto[(40 * fila) + j + inicio] = 0x20
end
end
fila = fila + rnd(3) + 3
end
-- crea columnas aleatories
local columna = primera_columna
while columna < ultima_columna - 1 do
if rnd(10) % 10 > 4 then
-- 60% de probabilitat de pintar la columna sencera
for j = primera_fila, ultima_fila do
laberinto[(40 * j) + columna] = 0x20
end
else
-- 40% de probabilitat de pintar sols un segment
longitud = max(5, rnd(ultima_fila - primera_fila) + 1)
inicio = rnd(ultima_fila - longitud) + primera_fila - 1
for j = 1, longitud do
laberinto[(40 * (j + inicio)) + columna] = 0x20
end
end
columna = columna + rnd(2) + 2
end
end
function pinta_laberinto()
-- pinta el laberinto en pantalla
for i = 0, 1199 do
ink(10)
print(chr(laberinto[i]), i % 40, flr(i / 40))
-- crea el efecto 3D pintant un caracter per damunt
if laberinto[i] == 0x8F then
-- color(15,10)
-- print(chr(0xCF), i % 40, flr(i / 40)-1)
-- print(chr(0xCF), i % 40, flr(i / 40)-2)
end
end
end
function pinta_jugador()
ink(0)
print(chr(0xF8), jugador.x, jugador.y)
end
function mou_jugador()
-- mou el jugador a la nova ubicacio en funció de les tecles apretades
if jugador.velocitat == 0 then
if btn(KEY_UP) then
coloca_jugador(jugador.x, jugador.y - 1)
elseif btn(KEY_DOWN) then
coloca_jugador(jugador.x, jugador.y + 1)
end
if btn(KEY_LEFT) then
coloca_jugador(jugador.x - 1, jugador.y)
elseif btn(KEY_RIGHT) then
coloca_jugador(jugador.x + 1, jugador.y)
end
else
jugador.velocitat = jugador.velocitat - 1
end
end
function coloca_jugador(x, y)
-- coloca el jugador en el punt x, y en cas de que siga una casella válida
if laberinto[y * 40 + x] == 0x20 then
jugador.x = x
jugador.y = y
jugador.velocitat = 8
end
end
function pinta_malos()
-- pina els malos en pantalla
ink(4)
for i = 1, num_malos do
print(chr(0x07), malos[i].x, malos[i].y)
end
end
function crea_malos()
-- inicialitza el vector de malos
for i = 1, num_malos do
malos[i].x = ultima_columna
malos[i].y = primera_fila
malos[i].dx = -1
malos[i].dy = 0
pensa_malo(i)
end
end
function mou_malos()
-- mou tots els malos a la nova ubicacio en funció de la seua direcció
for i = 1, num_malos do
if malos[i].velocitat == 0 then
coloca_malo(i, malos[i].x + malos[i].dx, malos[i].y + malos[i].dy)
if num_eixides_mapa(malos[i].x, malos[i].y) > 2 then
pensa_malo(i)
end
else
malos[i].velocitat = malos[i].velocitat - 1
end
end
end
function coloca_malo(num, x, y)
-- coloca el malo en el punt x, y en cas de que siga una casella válida
if laberinto[y * 40 + x] == 0x20 then
malos[num].x = x
malos[num].y = y
malos[num].velocitat = 16
end
end
function pensa_malo(num)
-- el malo calcula la direcció que ha de pendre per anar cap al jugador
if malos[num].x > jugador.x then
malos[num].dx = -1
else
if malos[num].x < jugador.x then
malos[num].dx = 1
else
malos[num].dx = 0
end
end
if malos[num].y > jugador.y then
malos[num].dy = -1
else
if malos[num].y < jugador.y then
malos[num].dy = 1
else
malos[num].dy = 0
end
end
end
function num_eixides_mapa(x, y)
-- torna el numero de caselles amb cami que hi ha al voltant del punt x, y
local eixides = 0
if laberinto[y * 40 + x + 1] == 0x20 then
eixides = eixides + 1
end
if laberinto[y * 40 + x - 1] == 0x20 then
eixides = eixides + 1
end
if laberinto[(y + 1) * 40 + x] == 0x20 then
eixides = eixides + 1
end
if laberinto[(y - 1) * 40 + x] == 0x20 then
eixides = eixides + 1
end
return eixides
end