130 lines
4.1 KiB
Lua
130 lines
4.1 KiB
Lua
-- Pepe Runner — port a ascii/Lua del joc original en Turbo Pascal (JailDesigner, 2000)
|
|
-- Fase 1: render estatic d'un mapa
|
|
|
|
-- Codis CP437 dels sprites del joc original (de TIPOS.PAS)
|
|
BUIT = 0
|
|
DINERS = 36 -- $
|
|
PEDRA = 219 -- bloc solid
|
|
ESCALA = 205 -- ═ (linia doble horitzontal, formant graons d'escala)
|
|
CORDA = 196 -- ─ (linia simple horitzontal)
|
|
BLOC1 = 176 -- ░
|
|
BLOC2 = 177 -- ▒
|
|
BLOC3 = 178 -- ▓
|
|
PEPE_C = 2 -- sprite del Pepe
|
|
MALO_C = 88 -- 'X' enemics
|
|
|
|
-- Colors (de TIPOS.PAS, paleta CGA — coincideix amb la d'ascii)
|
|
COL_PEDRA = COLOR_BROWN -- 6
|
|
COL_DINERS = COLOR_YELLOW -- 14
|
|
COL_ESCALA = COLOR_LIGHT_GRAY -- 7
|
|
COL_CORDA = COLOR_LIGHT_GRAY -- 7
|
|
COL_BUIT = COLOR_BLACK -- 0
|
|
|
|
-- Mida del mapa (del joc original)
|
|
MAP_W = 40
|
|
MAP_H = 25
|
|
|
|
-- Estat
|
|
mapa = {} -- mapa[x][y] = { tipo=, color=, temps= }
|
|
level = 1
|
|
pepe = { x=19, y=23, dibuix=PEPE_C, color=COLOR_WHITE, vides=0, estat=0 }
|
|
|
|
function definir_glifs()
|
|
-- Cel·la buida (sobreescrivim el glif 0 del ROM, que no es buit)
|
|
setchar(BUIT, 0,0,0,0,0,0,0,0)
|
|
|
|
-- Pedra (█) — bloc solid
|
|
setchar(PEDRA, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
|
|
|
|
-- Diners ($) — signe dolar classic
|
|
setchar(DINERS, 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00)
|
|
|
|
-- Escala (═) — doble linia horitzontal
|
|
setchar(ESCALA, 0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00)
|
|
|
|
-- Corda (─) — linia horitzontal simple
|
|
setchar(CORDA, 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00)
|
|
|
|
-- Blocs degradats (per al fade dels forats)
|
|
setchar(BLOC1, 0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11) -- ░ light
|
|
setchar(BLOC2, 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55) -- ▒ medium
|
|
setchar(BLOC3, 0xBB,0xEE,0xBB,0xEE,0xBB,0xEE,0xBB,0xEE) -- ▓ dark
|
|
|
|
-- Pepe (cara feliç tipus CP437 char 2 ☻)
|
|
setchar(PEPE_C, 0x7E,0x81,0xA5,0x81,0xBD,0x99,0x81,0x7E)
|
|
|
|
-- Enemic — una 'X' marcada
|
|
setchar(MALO_C, 0x00,0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3)
|
|
end
|
|
|
|
-- Retorna el color associat a un tipus de cel·la
|
|
function color_de(tipo)
|
|
if tipo == PEDRA then return COL_PEDRA end
|
|
if tipo == DINERS then return COL_DINERS end
|
|
if tipo == ESCALA then return COL_ESCALA end
|
|
if tipo == CORDA then return COL_CORDA end
|
|
return COL_BUIT
|
|
end
|
|
|
|
-- Carrega un mapa des d'un fitxer .map (1000 bytes, column-major: byte[x*25+y])
|
|
-- Estrategia: filein() a l'adreca 0 (sobreescriu char_screen), llegim amb peek()
|
|
-- a una taula Lua, i despres fem cls() per netejar la pantalla.
|
|
function carregar_mapa(num)
|
|
filein("maps/"..tostr(num)..".map", 0, MAP_W*MAP_H)
|
|
for x = 0, MAP_W-1 do
|
|
mapa[x] = {}
|
|
for y = 0, MAP_H-1 do
|
|
local tipo = peek(x*MAP_H + y)
|
|
mapa[x][y] = { tipo=tipo, color=color_de(tipo), temps=-1 }
|
|
end
|
|
end
|
|
end
|
|
|
|
function pintar_mapa()
|
|
for x = 0, MAP_W-1 do
|
|
for y = 0, MAP_H-1 do
|
|
local c = mapa[x][y]
|
|
if c.tipo ~= BUIT then
|
|
color(c.color, COL_BUIT)
|
|
print(chr(c.tipo), x, y)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function pintar_pepe()
|
|
color(pepe.color, COL_BUIT)
|
|
print(chr(pepe.dibuix), pepe.x, pepe.y)
|
|
end
|
|
|
|
-- Pepe pot entrar a una cel·la si no es pedra (de moment).
|
|
-- Mes endavant afegirem regles d'escala, cuerda, gravetat, etc.
|
|
function pot_entrar(x, y)
|
|
if x < 0 or x >= MAP_W or y < 0 or y >= MAP_H then return false end
|
|
return mapa[x][y].tipo ~= PEDRA
|
|
end
|
|
|
|
function mou_pepe()
|
|
-- Tecles originals: Q=amunt, A=avall, O=esquerra, P=dreta
|
|
if btnp(KEY_Q) and pot_entrar(pepe.x, pepe.y-1) then pepe.y = pepe.y - 1 end
|
|
if btnp(KEY_A) and pot_entrar(pepe.x, pepe.y+1) then pepe.y = pepe.y + 1 end
|
|
if btnp(KEY_O) and pot_entrar(pepe.x-1, pepe.y) then pepe.x = pepe.x - 1 end
|
|
if btnp(KEY_P) and pot_entrar(pepe.x+1, pepe.y) then pepe.x = pepe.x + 1 end
|
|
end
|
|
|
|
function init()
|
|
mode(1) -- 40x30 chars, color per cel·la
|
|
border(COLOR_BLUE)
|
|
color(COLOR_LIGHT_GRAY, COLOR_BLACK)
|
|
definir_glifs()
|
|
carregar_mapa(level)
|
|
cls() -- neteja despres del filein (que ha escrit a char_screen)
|
|
end
|
|
|
|
function update()
|
|
mou_pepe()
|
|
cls()
|
|
pintar_mapa()
|
|
pintar_pepe()
|
|
end
|