26 Commits

Author SHA1 Message Date
JailDesigner 446d812270 Titol de finestra i ESC per a eixir 2026-05-18 13:31:27 +02:00
JailDesigner 28f2d91c5c DX: numero de versio a la pantalla de titol amb color definible per skin 2026-05-15 22:10:00 +02:00
JailDesigner 2ceda2b809 DX: color propi (gameover_box) per al cuadre del FI DE JOC 2026-05-15 22:04:24 +02:00
JailDesigner b1fc60cdd9 DX: reseteja input_buf al inicialitzacio per a no heretar edges de la partida anterior 2026-05-15 21:59:21 +02:00
JailDesigner e8340472f8 DX: pantalla de record amb marc, asteriscos i centrat vertical 2026-05-15 21:54:59 +02:00
JailDesigner 380cab4176 DX: buffer d'edges per a moviment (arregla input lag sense doble pas) 2026-05-15 21:40:49 +02:00
JailDesigner 246b9cc687 DX: lleva el HUD a la pantalla de titol i baixa el text una linia 2026-05-15 21:21:09 +02:00
JailDesigner aba2acbdf3 DX: config.lua com a unica font de configuracio (sense defaults amagats) 2026-05-15 21:19:07 +02:00
JailDesigner 525ca12c9a DX: malos a cp 247-249 per a no pisar lletres X/Y/Z 2026-05-15 21:07:50 +02:00
JailDesigner 5aca78a38e DX: game over amb typewriter, cuadre de fons i Pepe trist 2026-05-15 21:04:36 +02:00
JailDesigner 64bb710531 DX: skins externalitzades a skins/<nom>.lua amb sprites propis 2026-05-15 20:21:53 +02:00
JailDesigner 7e29b4b6a2 DX: malos atrapats als forats, com en Lode Runner classic 2026-05-15 18:34:46 +02:00
JailDesigner 5b3b0b3f6a DX: sfx de respawn i color de parpadeig d'invulnerabilitat configurable 2026-05-15 18:06:22 +02:00
JailDesigner 8f8d71afcd DX: jingles als estats no-jugables (title i enter name) 2026-05-15 17:58:55 +02:00
JailDesigner 89dd0fc4e2 no versionar els binaris del interpret ascii (SDL2.dll, ascii.exe) 2026-05-15 17:47:01 +02:00
JailDesigner fa336c6861 DX: contador animat, fades, mort animada i escala creixent 2026-05-15 16:35:54 +02:00
JailDesigner 5fc43cebe3 DX: arregla 'Vides /' al game over (bug de tostr amb negatius) 2026-05-15 13:54:46 +02:00
JailDesigner cd319a3bec DX: textos a taula configurable, sentence case i tecla Q per sortir partida 2026-05-15 13:52:26 +02:00
JailDesigner 4d7868de49 DX: marc decoratiu al voltant del HUD 2026-05-15 13:42:56 +02:00
JailDesigner f8f63111b0 DX: ofset +1 al logo del title per a centrar-lo millor 2026-05-15 13:37:31 +02:00
JailDesigner a3f05edd28 DX: traduccio al valencia dels textos del joc 2026-05-15 13:36:00 +02:00
JailDesigner 67d48b6942 DX: HUD equilibrat en 5 files, text centrat 2026-05-15 13:26:17 +02:00
JailDesigner 8f9ba8537e DX: teclat configurable (cursors + Z/X per defecte) 2026-05-15 13:22:02 +02:00
JailDesigner e34b5a20ce DX: paleta configurable i fons unificat darrere dels glifs 2026-05-15 13:19:22 +02:00
JailDesigner 8291f386fa DX: skins, config.lua i chuleta del ROM 2026-05-15 13:06:47 +02:00
JailDesigner 64feca0e04 ignorar el fitxer records 2026-05-15 13:06:47 +02:00
14 changed files with 1490 additions and 0 deletions
+8
View File
@@ -70,3 +70,11 @@ Temporary Items
# Claude Code local settings
.claude/
# Fitxer de records (estat local del jugador)
records
# Binaris del interpret ascii (no son del joc)
ascii
ascii.exe
SDL2.dll
+2
View File
@@ -96,6 +96,8 @@ El atributo de color de una celda es 1 byte: nibble bajo = INK (tinta), nibble a
> **Nota**: `whichbtn()` está declarado en `ascii.h` y existe en C++, pero **no está expuesto a Lua** (no aparece en los `lua_setglobal` de `lua.cpp`). Para detectar qué tecla se ha pulsado en un frame hay que iterar con `btnp()` sobre las constantes `KEY_*`.
> **Bug de `tostr` con negativos**: la implementación de `tostr()` en `lua.cpp` (función `intToStr`) hace `(x % 10) + '0'` que con `x = -1` produce `-1 + 48 = 47`, o sea `'/'`. Por tanto `tostr(-1)` devuelve `"/"`, `tostr(-2)` devuelve `"."`, etc. Si vas a imprimir un número que puede ser negativo, usa `string.format("%d", n)` (que sí maneja signo) o clampa con `max(0, n)` antes de pasar a `tostr`.
Códigos de tecla — todos definidos como globales `KEY_*` en Lua. Lista completa (de `lua.cpp` 502-608):
```
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

+123
View File
@@ -0,0 +1,123 @@
-- Configuracio del Pepe Runner DX.
--
-- Aquest fitxer es LA UNICA FUENT DE VERDAT per als valors editables del
-- joc (skin, tecles, textos, temps de les animacions, vides, audio).
-- El motor del joc (pepe_runner_dx.lua) llig aquestes globals al iniciar
-- via dofile("config.lua"); no hi ha defaults amagats al codi.
--
-- Si vols recuperar un valor "original", consulta la rama de git o este
-- mateix fitxer en versions anteriors. Si elimines una clau, el joc petara
-- al usar-la — millor que prendre un valor obscur per defecte.
-- ====================================================================
-- INFO
-- ====================================================================
-- Versio del joc. Apareix centrada a la part baixa de la pantalla de
-- titol. Format lliure (mostra el que pose ací).
version = "v2.0.0"
-- ====================================================================
-- ASPECTE GRAFIC
-- ====================================================================
-- Skin: nom del fitxer (sense extensio) dins de la carpeta skins/ que
-- aporta els bitmaps i colors del joc. Skins inclosos:
--
-- "custom" — Estil fidel a l'original de Pascal (CP437: █ ═ ─ ☻ X).
-- "native" — Bitmaps copiats del ROM nadiu d'ascii (look "fantasy console").
-- "pintor" — Look revisat amb sprites propis (Pepe i 3 enemics diferents,
-- escala de ma, pedra que decreix d'altura al cavar...).
--
-- Cada skin defineix la seua propia paleta i bitmaps. Per a personalitzar
-- colors o sprites, edita el fitxer corresponent a skins/<nom>.lua.
-- (En tots els casos el char 0 es reescriu a zeros, perque el ROM d'ascii
-- hi te una caixa hueca que taparia tot el mapa.)
skin = "pintor"
-- ====================================================================
-- JUGABILITAT
-- ====================================================================
-- Vides inicials. Convencio arcade (com Pac-Man): el numero es de
-- "reserves", no de vides totals. 2 reserves = 3 vides totals (la actual +
-- les 2 que es veuen al HUD). 0 = una sola oportunitat.
VIDES_INI = 2
-- Fase per la qual arranca una partida nova (1..10).
-- Util per a depurar un mapa concret sense haver de jugar des de la 1.
LEVEL_INI = 1
-- ====================================================================
-- TECLES
-- ====================================================================
-- Mapeig per defecte: cursors per a moure's, Z/X per a fer forats.
-- Pots usar qualsevol constant KEY_* del intérpret (KEY_A..KEY_Z,
-- KEY_UP/DOWN/LEFT/RIGHT, KEY_SPACE, KEY_RETURN, ...).
-- Nota: ESC a seques tanca el joc (la consola de debug del intérpret
-- s'obri amb CTRL+ESC desde la versió 0.7.8 de ascii).
keys = {
up = KEY_UP,
down = KEY_DOWN,
left = KEY_LEFT,
right = KEY_RIGHT,
dig_left = KEY_Z,
dig_right = KEY_X,
quit = KEY_Q, -- abandona la partida → game over
}
-- ====================================================================
-- TEXTOS DEL JOC
-- ====================================================================
-- Tots els missatges que veu el jugador. Pots editar per a corregir
-- ortografia o traduir a una altra variant sense haver de tocar el .lua.
-- (Convencio: Inicial Majuscula, resta minuscula.)
textos = {
title_press_play = "Prem l'espai per a jugar",
game_over = "FI DE JOC",
new_record = "Nou record !",
score_label = "Punts",
level_label = "Nivell",
lives_label = "Vides",
record_label = "Record",
name_label = "Nom:",
name_help = "Tecles A-Z",
}
-- ====================================================================
-- TEMPS I DURACIONS
-- ====================================================================
-- Tots els valors van en *frames* (a 60 fps, 60 frames = 1 segon).
-- Pots ajustar la sensacio del joc sense tocar el .lua.
temps = {
score_step = 3, -- frames per cada +1 del comptador animat
-- del HUD. 3 = ~20 punts/segon.
fade_frames = 18, -- duracio de cada fase del fade (out i in
-- son simetrics). 18 = 0.3 s per fase.
mort_anim_frames = 30, -- duracio de l'animacio visual de mort
-- (Pepe visible parpadejant + careta trista).
respawn_delay_frames = 120, -- temps que Pepe queda invisible abans
-- del respawn (els malos segueixen).
invuln_frames = 180, -- temps que Pepe es invulnerable al
-- respawn, parpadejant blanc/groc.
escala_step_frames = 6, -- frames entre cada cel·la nova de
-- l'escala lateral quan creix.
gameover_delay_frames = 15, -- espera abans del typewriter de
-- "FI DE JOC" (perque no es solape
-- amb sfx_gameover).
typewriter_step_frames = 8, -- frames per cada lletra del
-- typewriter al game over.
gameover_show_frames = 120, -- temps que el text final es queda
-- visible abans de la transicio.
}
-- ====================================================================
-- AUDIO (jingles dels estats no-jugables)
-- ====================================================================
-- L'engine d'ascii nomes te 1 canal d'audio: per aixo no hi ha musica
-- in-game (les SFX la tallarien). Es reprodueixen una sola vegada per
-- entrada al estat (no en bucle).
music_on = true -- false desactiva tots els jingles. Les SFX continuen.
-- Melodies en MML estandard (vore ASCII_API.md §4).
musica = {
title = "l4o4cegfedcceg",
entername = "l2o5cegcegced",
}
+2
View File
@@ -618,6 +618,7 @@ function pintar_hud()
end
function init()
wintitle("© 2000 Pepe Runner — JailDesigner")
mode(1)
border(COLOR_BLUE)
color(COLOR_LIGHT_GRAY, COLOR_BLACK)
@@ -629,6 +630,7 @@ function init()
end
function update()
if btnp(KEY_ESCAPE) then os.exit(0) end
if estat_joc == ESTAT_TITLE then update_title()
elseif estat_joc == ESTAT_PLAYING then update_playing()
elseif estat_joc == ESTAT_GAMEOVER then update_gameover()
+1221
View File
File diff suppressed because it is too large Load Diff
+43
View File
@@ -0,0 +1,43 @@
-- Skin "custom" — el look fidel a l'original de Pascal (CP437).
-- Per als sprites nous (pepe_mort_a/b, malo2/3) repetim els bitmaps base
-- perque la skin original no tenia sprites diferents per a cada cas.
--
-- Constants de color disponibles (paleta CGA/EGA de 16, vore ASCII_API.md §3):
-- COLOR_BLACK=0 COLOR_DARK_GRAY=8
-- COLOR_BLUE=1 COLOR_LIGHT_BLUE=9
-- COLOR_GREEN=2 COLOR_LIGHT_GREEN=10
-- COLOR_CYAN=3 COLOR_LIGHT_CYAN=11
-- COLOR_RED=4 COLOR_LIGHT_RED=12
-- COLOR_MAGENTA=5 COLOR_LIGHT_MAGENTA=13
-- COLOR_BROWN=6 COLOR_YELLOW=14
-- COLOR_LIGHT_GRAY=7 COLOR_WHITE=15
return {
elements = {
diners = { cp = 36, bitmap = {0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, color = COLOR_YELLOW },
pedra = { cp = 219, bitmap = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, color = COLOR_BROWN },
escala = { cp = 205, bitmap = {0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00}, color = COLOR_LIGHT_CYAN },
corda = { cp = 196, bitmap = {0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00}, color = COLOR_LIGHT_GRAY },
bloc1 = { cp = 176, bitmap = {0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11}, color = COLOR_BROWN },
bloc2 = { cp = 177, bitmap = {0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55}, color = COLOR_BROWN },
bloc3 = { cp = 178, bitmap = {0xBB,0xEE,0xBB,0xEE,0xBB,0xEE,0xBB,0xEE}, color = COLOR_BROWN },
pepe = { cp = 2, bitmap = {0x7E,0x81,0xA5,0x81,0xBD,0x99,0x81,0x7E}, color = COLOR_WHITE },
pepe_mort_a = { cp = 226, bitmap = {0x7E,0x81,0xA5,0x81,0x99,0xBD,0x81,0x7E}, color = COLOR_LIGHT_RED },
pepe_mort_b = { cp = 227, bitmap = {0x7E,0x81,0xA5,0x81,0x99,0xBD,0x81,0x7E}, color = COLOR_LIGHT_RED },
malo1 = { cp = 247, bitmap = {0x00,0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3}, color = COLOR_LIGHT_RED },
malo2 = { cp = 248, bitmap = {0x00,0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3}, color = COLOR_LIGHT_RED },
malo3 = { cp = 249, bitmap = {0x00,0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3}, color = COLOR_LIGHT_RED },
},
state_colors = {
bg = COLOR_BLUE,
border = COLOR_BLUE,
hud_text = COLOR_WHITE,
hud_bg = COLOR_BLACK,
title = COLOR_LIGHT_RED,
pepe_invuln = COLOR_LIGHT_GREEN,
malo_carrega = COLOR_LIGHT_MAGENTA,
malo_atrapat = COLOR_BROWN,
score_flash = COLOR_YELLOW,
gameover_box = COLOR_BLUE, -- fons del cuadre del text "FI DE JOC"
version = COLOR_LIGHT_BLUE, -- text de versio a la pantalla de titol
},
}
+44
View File
@@ -0,0 +1,44 @@
-- Skin "native" — bitmaps copiats del ROM nadiu d'ascii (rom.h) als
-- code-points reservats per a cada element. Manté la regla "cp idèntics
-- en totes les skins" sense haver de dependre que el ROM tinga el glif
-- en eixos code-points concrets.
--
-- Constants de color disponibles (paleta CGA/EGA de 16, vore ASCII_API.md §3):
-- COLOR_BLACK=0 COLOR_DARK_GRAY=8
-- COLOR_BLUE=1 COLOR_LIGHT_BLUE=9
-- COLOR_GREEN=2 COLOR_LIGHT_GREEN=10
-- COLOR_CYAN=3 COLOR_LIGHT_CYAN=11
-- COLOR_RED=4 COLOR_LIGHT_RED=12
-- COLOR_MAGENTA=5 COLOR_LIGHT_MAGENTA=13
-- COLOR_BROWN=6 COLOR_YELLOW=14
-- COLOR_LIGHT_GRAY=7 COLOR_WHITE=15
return {
elements = {
diners = { cp = 36, bitmap = {0x18,0x3E,0x58,0x3C,0x1A,0x7C,0x18,0x00}, color = COLOR_YELLOW },
pedra = { cp = 219, bitmap = {0x00,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x00}, color = COLOR_BROWN },
escala = { cp = 205, bitmap = {0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00}, color = COLOR_LIGHT_CYAN },
corda = { cp = 196, bitmap = {0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00}, color = COLOR_LIGHT_GRAY },
bloc1 = { cp = 176, bitmap = {0xAA,0x55,0xAA,0x55,0x00,0x00,0x00,0x00}, color = COLOR_BROWN },
bloc2 = { cp = 177, bitmap = {0x00,0x00,0x00,0x00,0xAA,0x55,0xAA,0x55}, color = COLOR_BROWN },
bloc3 = { cp = 178, bitmap = {0xAA,0x54,0xA8,0x50,0xA0,0x40,0x80,0x00}, color = COLOR_BROWN },
pepe = { cp = 2, bitmap = {0x7E,0xFF,0x99,0xFF,0xBD,0xC3,0xFF,0x7E}, color = COLOR_WHITE },
pepe_mort_a = { cp = 226, bitmap = {0x7E,0xFF,0x99,0xFF,0xC3,0xBD,0xFF,0x7E}, color = COLOR_LIGHT_RED },
pepe_mort_b = { cp = 227, bitmap = {0x7E,0xFF,0x99,0xFF,0xC3,0xBD,0xFF,0x7E}, color = COLOR_LIGHT_RED },
malo1 = { cp = 247, bitmap = {0xC6,0x6C,0x38,0x38,0x6C,0xC6,0xC6,0x00}, color = COLOR_LIGHT_RED },
malo2 = { cp = 248, bitmap = {0xC6,0x6C,0x38,0x38,0x6C,0xC6,0xC6,0x00}, color = COLOR_LIGHT_RED },
malo3 = { cp = 249, bitmap = {0xC6,0x6C,0x38,0x38,0x6C,0xC6,0xC6,0x00}, color = COLOR_LIGHT_RED },
},
state_colors = {
bg = COLOR_BLUE,
border = COLOR_BLUE,
hud_text = COLOR_WHITE,
hud_bg = COLOR_BLACK,
title = COLOR_LIGHT_RED,
pepe_invuln = COLOR_LIGHT_GREEN,
malo_carrega = COLOR_LIGHT_MAGENTA,
malo_atrapat = COLOR_BROWN,
score_flash = COLOR_YELLOW,
gameover_box = COLOR_BLUE, -- fons del cuadre del text "FI DE JOC"
version = COLOR_LIGHT_BLUE, -- text de versio a la pantalla de titol
},
}
+47
View File
@@ -0,0 +1,47 @@
-- Skin "pintor" — bitmaps i colors creats per a la versio DX.
-- Format del fitxer:
-- elements = id_logic_string → { cp = code_point, bitmap = {8 bytes}|nil, color = COLOR_X }
-- state_colors = nom_estat → COLOR_X (ambient i estats del joc, no lligats a un element)
--
-- Constants de color disponibles (paleta CGA/EGA de 16, vore ASCII_API.md §3):
-- COLOR_BLACK=0 COLOR_DARK_GRAY=8
-- COLOR_BLUE=1 COLOR_LIGHT_BLUE=9
-- COLOR_GREEN=2 COLOR_LIGHT_GREEN=10
-- COLOR_CYAN=3 COLOR_LIGHT_CYAN=11
-- COLOR_RED=4 COLOR_LIGHT_RED=12
-- COLOR_MAGENTA=5 COLOR_LIGHT_MAGENTA=13
-- COLOR_BROWN=6 COLOR_YELLOW=14
-- COLOR_LIGHT_GRAY=7 COLOR_WHITE=15
return {
elements = {
diners = { cp = 36, bitmap = {0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, color = COLOR_YELLOW },
pedra = { cp = 219, bitmap = {0xFF,0xF6,0xBF,0xFE,0xF7,0xBE,0xFF,0xAA}, color = COLOR_BROWN },
escala = { cp = 205, bitmap = {0xC3,0xFF,0xFF,0xC3,0xC3,0xFF,0xFF,0xC3}, color = COLOR_LIGHT_GRAY },
corda = { cp = 196, bitmap = {0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, color = COLOR_LIGHT_GRAY },
-- Bloc 1/2/3: la pedra es cava decrescut en altura, pero mantenint
-- la textura de la pedra (les files inferiors de pedra) per a que es
-- veja com si la pedra real es va desfent des de dalt.
bloc1 = { cp = 176, bitmap = {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xAA}, color = COLOR_BROWN },
bloc2 = { cp = 177, bitmap = {0x00,0x00,0x00,0x00,0xF7,0xBE,0xFF,0xAA}, color = COLOR_BROWN },
bloc3 = { cp = 178, bitmap = {0x00,0x00,0xBF,0xFE,0xF7,0xBE,0xFF,0xAA}, color = COLOR_BROWN },
pepe = { cp = 2, bitmap = {0x7E,0xFF,0xDB,0xDB,0xFF,0xC3,0xE7,0x7E}, color = COLOR_YELLOW },
pepe_mort_a = { cp = 226, bitmap = {0x7E,0xFF,0x93,0xFF,0xFF,0xAB,0xD7,0x7E}, color = COLOR_LIGHT_RED },
pepe_mort_b = { cp = 227, bitmap = {0x7E,0xFF,0xC9,0xFF,0xFF,0xD5,0xEB,0x7E}, color = COLOR_LIGHT_MAGENTA },
malo1 = { cp = 247, bitmap = {0xC3,0x3C,0x7E,0x72,0x7E,0x72,0x3C,0xC3}, color = COLOR_LIGHT_RED },
malo2 = { cp = 248, bitmap = {0xD8,0x33,0x7C,0xFC,0xFC,0x7C,0x33,0xD8}, color = COLOR_LIGHT_RED },
malo3 = { cp = 249, bitmap = {0x07,0xEB,0x38,0x38,0x38,0x38,0xEB,0x07}, color = COLOR_LIGHT_RED },
},
state_colors = {
bg = COLOR_BLUE,
border = COLOR_BLUE,
hud_text = COLOR_WHITE,
hud_bg = COLOR_LIGHT_BLUE,
title = COLOR_LIGHT_RED,
pepe_invuln = COLOR_LIGHT_GREEN,
malo_carrega = COLOR_LIGHT_MAGENTA,
malo_atrapat = COLOR_BROWN,
score_flash = COLOR_YELLOW,
gameover_box = COLOR_BLUE, -- fons del cuadre del text "FI DE JOC"
version = COLOR_LIGHT_BLUE, -- text de versio a la pantalla de titol
},
}