DX: paleta configurable i fons unificat darrere dels glifs

This commit is contained in:
2026-05-15 13:19:22 +02:00
parent 8291f386fa
commit e34b5a20ce
2 changed files with 92 additions and 39 deletions
+26
View File
@@ -20,3 +20,29 @@
-- (En els dos casos el char 0 es reescriu a zeros, perque el ROM d'ascii
-- hi te una caixa hueca que taparia tot el mapa.)
skin = "native"
-- ====================================================================
-- PALETA DE COLORS
-- ====================================================================
-- Constants disponibles:
-- COLOR_BLACK=0 COLOR_BLUE=1 COLOR_GREEN=2 COLOR_CYAN=3
-- COLOR_RED=4 COLOR_MAGENTA=5 COLOR_BROWN=6 COLOR_LIGHT_GRAY=7
-- COLOR_DARK_GRAY=8 COLOR_LIGHT_BLUE=9 COLOR_LIGHT_GREEN=10
-- COLOR_LIGHT_CYAN=11 COLOR_LIGHT_RED=12 COLOR_LIGHT_MAGENTA=13
-- COLOR_YELLOW=14 COLOR_WHITE=15
--
-- Pots sobreescriure nomes les que vulgues. Comenta una linia
-- per a deixar el valor per defecte.
-- colors.bg = COLOR_BLUE -- fons del nivell
-- colors.pedra = COLOR_BROWN -- murs i blocs degradats
-- colors.diners = COLOR_YELLOW -- $ monedes
-- colors.escala = COLOR_LIGHT_CYAN -- ═ escales
-- colors.corda = COLOR_LIGHT_GRAY -- ─ cordes
-- colors.pepe = COLOR_WHITE -- el protagonista
-- colors.malo = COLOR_LIGHT_RED -- enemics
-- colors.malo_carrega = COLOR_LIGHT_MAGENTA -- enemic portant diners
-- colors.hud_text = COLOR_WHITE -- text del rotul inferior
-- colors.hud_bg = COLOR_BLACK -- fons del rotul inferior
-- colors.border = COLOR_BLUE -- vora exterior de la finestra
-- colors.title = COLOR_LIGHT_RED -- GAME OVER / NOU RECORD
+66 -39
View File
@@ -39,12 +39,24 @@ SKINS = {
}
glif = SKINS.custom -- s'actualitza a init() segons la config
-- 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
-- Paleta — tots els colors son sobreescriuibles per config.lua.
-- bg es el color del fons del nivell (pintat tant a les cel·les buides com
-- darrere de cada glif), per a que tot quede integrat en lloc de tindre
-- negre darrere dels caracters.
colors = {
bg = COLOR_BLUE, -- fons del nivell
pedra = COLOR_BROWN,
diners = COLOR_YELLOW,
escala = COLOR_LIGHT_CYAN,
corda = COLOR_LIGHT_GRAY,
pepe = COLOR_WHITE,
malo = COLOR_LIGHT_RED,
malo_carrega = COLOR_LIGHT_MAGENTA, -- enemic portant diners
hud_text = COLOR_WHITE,
hud_bg = COLOR_BLACK,
border = COLOR_BLUE,
title = COLOR_LIGHT_RED,
}
-- Estats (de TIPOS.PAS — son bitflags per a SelectEstat dels enemics)
NORMAL = 0
@@ -74,7 +86,7 @@ ESTAT_ENTERNAME = "entername"
-- Estat global
mapa = {} -- mapa[x][y] = { tipo=, color=, temps= }
level = 1
pepe = { x=19, y=23, dibuix=PEPE_C, color=COLOR_WHITE, vides=VIDES_INI, estat=NORMAL }
pepe = { x=19, y=23, dibuix=PEPE_C, color=colors.pepe, vides=VIDES_INI, estat=NORMAL }
malos = {}
score = 0
diners_pantalla = 0
@@ -114,12 +126,19 @@ function sfx_malo_die() play("l0o3ao4c") end
function sfx_level() play("l1o4ceg") end
function sfx_gameover() play("l1o3bal0gfedco2c") end
-- Neteja la pantalla amb el color de fons configurat (en lloc de negre).
function neteja_fons()
color(colors.bg, colors.bg)
cls()
end
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
if tipo == PEDRA then return colors.pedra end
if tipo == DINERS then return colors.diners end
if tipo == ESCALA then return colors.escala end
if tipo == CORDA then return colors.corda end
if tipo == BLOC1 or tipo == BLOC2 or tipo == BLOC3 then return colors.pedra end
return colors.bg
end
-- Helper segur per llegir el tipus d'una cel·la (fora de mapa = pedra virtual)
@@ -146,7 +165,7 @@ function pintar_mapa()
for y = 0, MAP_H-1 do
local c = mapa[x][y]
if c.tipo ~= BUIT then
color(c.color, COL_BUIT)
color(c.color, colors.bg)
print(chr(glif[c.tipo]), x, y)
end
end
@@ -154,7 +173,7 @@ function pintar_mapa()
end
function pintar_pepe()
color(pepe.color, COL_BUIT)
color(pepe.color, colors.bg)
print(chr(glif[pepe.dibuix]), pepe.x, pepe.y)
end
@@ -337,12 +356,12 @@ function update_title()
return
end
cls()
neteja_fons()
pintar_mapa()
-- "PRESS SPACE TO PLAY" parpadejant
if flr(cnt() / 30) % 2 == 0 then
color(COLOR_WHITE, COLOR_BLACK)
color(COLOR_WHITE, colors.bg)
print("PRESS SPACE TO PLAY", 10, 22)
end
@@ -352,12 +371,12 @@ end
-- ----- GAME OVER -----
function update_gameover()
-- Render congelat: ultim estat del joc + overlay "GAME OVER"
cls()
neteja_fons()
pintar_mapa()
pintar_malos()
pintar_pepe()
color(COLOR_LIGHT_RED, COLOR_BLACK)
color(colors.title, colors.bg)
print("G A M E O V E R", 11, 12)
pintar_hud()
@@ -378,12 +397,12 @@ end
-- ----- ENTER NAME -----
function update_entername()
cls()
color(COLOR_LIGHT_RED, COLOR_BLACK)
neteja_fons()
color(colors.title, colors.bg)
print("NOU RECORD!", 14, 10)
color(COLOR_YELLOW, COLOR_BLACK)
color(colors.diners, colors.bg)
print("SCORE "..string.format("%03d", hi_score), 15, 12)
color(COLOR_WHITE, COLOR_BLACK)
color(COLOR_WHITE, colors.bg)
print("NOM: "..nom_hi_score, 16, 15)
print("(A-Z)", 17, 17)
@@ -429,7 +448,7 @@ function update_playing()
end
-- Render
cls()
neteja_fons()
pintar_mapa()
pintar_malos()
pintar_pepe()
@@ -442,16 +461,16 @@ end
function init_malos()
malos = {
{ x= 9, y=2, color=COLOR_CYAN, estat=ESQUERRA, iaclock=0, carrega={ok=false, x=0, y=0} },
{ x=20, y=2, color=COLOR_CYAN, estat=ESQUERRA, iaclock=0, carrega={ok=false, x=0, y=0} },
{ x=39, y=2, color=COLOR_CYAN, estat=ESQUERRA, iaclock=0, carrega={ok=false, x=0, y=0} },
{ x= 9, y=2, color=colors.malo, estat=ESQUERRA, iaclock=0, carrega={ok=false, x=0, y=0} },
{ x=20, y=2, color=colors.malo, estat=ESQUERRA, iaclock=0, carrega={ok=false, x=0, y=0} },
{ x=39, y=2, color=colors.malo, estat=ESQUERRA, iaclock=0, carrega={ok=false, x=0, y=0} },
}
end
function pintar_malos()
for i = 1, NUM_MALOS do
local m = malos[i]
color(m.color, COL_BUIT)
color(m.color, colors.bg)
print(chr(glif[MALO_C]), m.x, m.y)
end
end
@@ -515,10 +534,10 @@ function mort_malo(m)
if m.carrega.ok then
local c = mapa[m.carrega.x][m.carrega.y]
c.tipo = DINERS
c.color = COL_DINERS
c.color = colors.diners
end
m.x = 39; m.y = 1
m.color = COLOR_CYAN
m.color = colors.malo
m.estat = CAENT
m.iaclock = 0
m.carrega.ok = false
@@ -572,7 +591,7 @@ function tic_malos()
-- agafar diners
if tipo_a(m.x, m.y) == DINERS and not m.carrega.ok then
mapa[m.x][m.y].tipo = BUIT
m.color = COLOR_LIGHT_CYAN
m.color = colors.malo_carrega
m.carrega.ok = true
m.carrega.x = m.x
m.carrega.y = m.y
@@ -604,7 +623,7 @@ function check_mapa_complet()
for j = 1, MAP_H-2 do
if mapa[0][j].tipo == PEDRA then break end
mapa[0][j].tipo = ESCALA
mapa[0][j].color = COL_ESCALA
mapa[0][j].color = colors.escala
end
end
@@ -618,15 +637,15 @@ function check_mapa()
if t == 0 then
c.temps = -1
c.tipo = PEDRA
c.color = COL_PEDRA
c.color = colors.pedra
elseif t == 1 or t == BLOC_OUT-1 then
c.tipo = BLOC3; c.color = COL_PEDRA; c.temps = t - 1
c.tipo = BLOC3; c.color = colors.pedra; c.temps = t - 1
elseif t == 2 or t == BLOC_OUT-2 then
c.tipo = BLOC2; c.color = COL_PEDRA; c.temps = t - 1
c.tipo = BLOC2; c.color = colors.pedra; c.temps = t - 1
elseif t == 3 or t == BLOC_OUT-3 then
c.tipo = BLOC1; c.color = COL_PEDRA; c.temps = t - 1
c.tipo = BLOC1; c.color = colors.pedra; c.temps = t - 1
elseif t == 4 or t == BLOC_OUT-4 then
c.tipo = BUIT; c.color = COL_BUIT; c.temps = t - 1
c.tipo = BUIT; c.color = colors.bg; c.temps = t - 1
elseif t > 0 then
c.temps = t - 1
end
@@ -638,7 +657,7 @@ end
-- HUD: rotul inferior amb level/score/vides/hi-score sobre banda blava
function pintar_hud()
color(COLOR_LIGHT_GRAY, COLOR_BLUE)
color(colors.hud_text, colors.hud_bg)
local blank = " "
print(blank, 0, 25)
print(blank, 0, 26)
@@ -650,16 +669,24 @@ function pintar_hud()
end
-- Carrega config.lua si existeix. Si falta o te errors, queden els defaults.
-- Despres del dofile, si l'usuari ha fet "colors = {bg=X}" en lloc d'assignar
-- camp a camp, hi haura claus que falten. Fem un merge amb les defaults
-- guardades per a que no quede res a nil.
function carregar_config()
local saved = {}
for k, v in pairs(colors) do saved[k] = v end
pcall(dofile, "config.lua")
for k, v in pairs(saved) do
if colors[k] == nil then colors[k] = v end
end
end
function init()
carregar_config()
glif = SKINS[skin] or SKINS.custom
mode(1)
border(COLOR_BLUE)
color(COLOR_LIGHT_GRAY, COLOR_BLACK)
border(colors.border)
color(colors.bg, colors.bg) -- ink no importa, paper=bg perque el cls() final empleni amb bg
definir_glifs()
carregar_records()
init_title()