Juegos
Un experimento (#176): juegos retro en la Vista TV, con
EmulatorJS (GPL-3.0) en el navegador y un mando de juego. Con
HOST_GAMES_DIR="/ruta/a/las/roms" en el .env se monta de solo lectura y aparece la tarjeta
Juegos en /tv; en desarrollo se usa GAMES_DIR. También se pueden abrir en
RetroDECK, en el PC de la pantalla.
install.sh lo pregunta. En una Raspberry conectada a la tele, sin PC: ver
Una sola Raspberry.
- Una carpeta por consola, cada una con su emulador:
nes,snes,gb,gbc,gba,mastersystemymegadrive. Las demás no salen. Los juegos pueden ir tal cual o en.zipo.7z. - Las recreativas, en
arcade, con FinalBurn Neo: sus.zipcon el nombre corto de FBNeo (sf2.zip), mejor de un romset no fusionado (cada.zipcon todo lo suyo) y de su versión 1.0.0.3, la del núcleo de EmulatorJS. La BIOS que necesiten (neogeo.zippara Neo Geo), en la misma carpeta: no sale en la lista y se le pasa al juego que la usa. Los nombres completos salen de la lista de juegos de FBNeo, que se baja una vez de GitHub (13 MB) y se guarda enHOST_DATA_DIR/juegos. - En
/tv/juegos, una tarjeta por consola; dentro, sus juegos en cuadrícula, cada uno con su carátula. - Las imágenes vienen de las miniaturas de
libretro (las de RetroArch), sin
cuenta: la carátula al abrir la consola, y la pantalla de título y una captura al abrir el juego.
Se buscan por el nombre No-Intro del fichero, como
Tetris (World).zip: con otro nombre no las encuentra. Se guardan enHOST_DATA_DIR/juegos. - Cada juego tiene su página, con «Jugar» y lo que se sabe de él: la primera vez que se abre se busca en Wikidata entre los juegos de su consola (año, desarrolladora, género, modos, música) y se trae el resumen de la Wikipedia. Si hay dudas, la página pregunta cuál es.
- El fondo de esa página se elige en ella entre esas imágenes y la que se capture jugando: Play/Pausa en el mando mientras se juega la guarda y la pone de fondo, y otra pulsación la cambia. Sin elegir, es la pantalla de título.
- El juego ocupa toda la pantalla. Atrás en el mando a distancia lo cierra y vuelve a su página, e Inicio, a la Vista TV.
- OK en el mando a distancia, o Select y Start a la vez en el mando de juego, pausa el juego y abre
su menú: Continuar, Guardar partida, Cargar partida, Reiniciar y Salir. Las partidas se guardan
en el servidor, por persona (en
HOST_DATA_DIR/partidas), con una imagen y la fecha; se pueden cargar desde cualquier dispositivo y borrar desde la lista. También salen en la página del juego, bajo su fondo: elegir una abre el juego en ese momento. En el menú, el mando de juego también sirve: la cruz, A y B. - Lo que guarda el propio juego (la pila del cartucho: un Zelda, un Pokémon) también va al
servidor, por persona (en
HOST_DATA_DIR/cartuchos): cada minuto si ha cambiado y al salir del juego. Al empezar se juega con el de esa persona, aunque otra haya jugado antes en ese navegador. El que ya hubiera en el navegador antes de esto se sube como de quien juegue primero. - Fuera de los juegos, el mando de juego sirve en toda la Vista TV como el mando a distancia: la cruceta (o el stick) se mueve, A es OK, B es Atrás, Start es Inicio y Select el micrófono. No llega a mpv: con una película o un capítulo delante, el navegador no lo lee.
- El mando de juego se reconoce por udev, y el Chromium de Flatpak no lo ve sin
flatpak override --user --filesystem=/run/udev:ro org.chromium.Chromium, que ponescripts/pantalla.sh. Luego hay que cerrar Chromium y abrirlo, y pulsar un botón del mando en el juego: hasta entonces el navegador no lo muestra. - Estadísticas de cada persona: cuánto ha jugado (sin contar pausas ni el menú), a qué y cuándo,
en
/tv/juegos/estadisticasy en la sección Juegos de la app completa; en la página de cada juego, el total y la última vez. Solo con «Guardar historial» activado en Ajustes. - EmulatorJS se carga de su CDN, en la versión 4.2.3: el salón necesita internet para jugar.
- Los botones del mando de juego, a gusto de cada persona y por consola, en la sección Juegos de
la app completa (
/juegos/mando): sobre un dibujo del mando se toca un botón y se elige qué hace en los juegos de esa consola; si eso ya lo hacía otro, se intercambian. Se aplican al empezar cada juego, por encima de lo que se cambie en el menú de EmulatorJS. La cruceta, los sticks y Select + Start para el menú no cambian. - Los shaders (cómo se ve la imagen: tele de tubo, suavizada o los píxeles tal cual), para toda la
casa, en
/juegos/shaders: uno para todos los juegos, otro por consola y otro por juego; manda el más cercano. Se aplica al empezar cada juego, por encima de lo elegido en el menú de EmulatorJS. El del juego también se elige jugando, en su menú (OK o Select + Start) → «Imagen»: al moverse por la lista se ve en el juego, A lo guarda y Atrás lo deja como estaba. - No está para los peques.
Los juegos instalados en el Steam del PC de la pantalla salen en /tv/juegos, en la tarjeta
Steam, y se abren allí en Big Picture. Con Steam nativo (no el Flatpak), en el .env:
HOST_STEAM_DIR="/home/yo/.local/share/Steam"y docker compose -f compose.prod.yaml up -d. En desarrollo, STEAM_DIR con esa ruta y
STEAM_SOCKET con el socket.
- La lista sale de los propios ficheros de Steam, de solo lectura: un
appmanifest_<appid>.acfpor juego instalado ensteamapps, y las carátulas de su biblioteca enappcache/librarycache. No se monta nada más de Steam (su configuración, sus cuentas). Solo la biblioteca principal: los juegos de otros discos no salen. - Proton y los Steam Linux Runtime también son «apps» instaladas, pero no tienen carátula en la biblioteca, y así se quedan fuera. Ubisoft Connect Services sí la tiene y sale.
- Para abrirlos,
scripts/pantalla.shinstala en ese PC un socket de systemd del usuario (deploy/jellycartoon-steam.socket) enHOST_DATA_DIR/steam.sock, junto al de mpv. Por cada juego elegido arrancajellycartoon-steam@.service, que condeploy/jellycartoon-steam.sh(instalado en~/.local/bin) abre conxdg-openlas direcciones de Steamsteam://open/bigpictureysteam://rungameid/<appid>. Steam corre en su propia unidad, no en esta. Si Steam no estaba abierto, abre primero Big Picture y manda el juego cuando ya está arriba (las dos a la vez arrancan dos Steam y el juego se pierde). - El primer recuadro, «Big Picture», abre solo Big Picture, sin juego, para la biblioteca y la
tienda de Steam: el socket recibe
bigpictureen vez de un appid. Tras cambiar el script, vuelve a pasarscripts/pantalla.sh. - Con Big Picture delante, la Vista TV deja de leer el mando de juego: solo lo lee con el foco.
- Al salir del juego queda Big Picture en la tele; el botón de encendido del mando vuelve a la Vista TV.
- Cada juego listado se guarda en la tabla
steam_gamepor su appid, para poder ponerle etiquetas más adelante (los juegos infantiles para los peques). - No está para los peques, y el tiempo de juego no se cuenta todavía.
- Si no abre nada:
systemctl --user status jellycartoon-steam.socketyjournalctl --user -u 'jellycartoon-steam@*'en ese PC, y el Registro de la app.
RetroDECK
Sección titulada «RetroDECK»Los juegos de HOST_GAMES_DIR también se pueden jugar en
RetroDECK en el PC de la pantalla, en vez de en el navegador: con su
Flatpak (net.retrodeck.retrodeck) instalado allí, la página de cada juego tiene
«Jugar en RetroDECK», y /tv/juegos, una tarjeta RetroDECK al final que lo abre sin juego, con
su propio menú (ES-DE).
- Para abrirlos,
scripts/pantalla.shinstala en ese PC un socket de systemd del usuario (deploy/jellycartoon-retrodeck.socket) enHOST_DATA_DIR/retrodeck.sock, junto al de Steam, yjellycartoon-retrodeck@.service, con la carpeta de las ROMs (la que la app monta en/games). Solo si RetroDECK está instalado y hayHOST_GAMES_DIR. La app ofrece el botón y la tarjeta solo mientras está el socket. En desarrollo,RETRODECK_SOCKETcon el socket. - La app manda la carpeta de la consola y el fichero (
snes/Tetris (World).sfc), oretrodeckpara la tarjeta, ydeploy/jellycartoon-retrodeck.sh(en~/.local/bin) lo abre con la línea de comandos de RetroDECK,flatpak run net.retrodeck.retrodeck -s <sistema> <rom>. Solo acepta una consola conocida y un fichero de su carpeta. - El sistema de ES-DE es el nombre de la carpeta, salvo
arcade, que esfbneo(elarcadede ES-DE es MAME). ES-DE elige el emulador: el que tenga elegido para ese sistema o ese juego y, si no, el primero, con RetroArch y sus núcleos, que vienen con RetroDECK (Mesen para NES, Snes9x, Gambatte, mGBA, Genesis Plus GX y FinalBurn Neo). - Las partidas guardadas, la pila del cartucho, los mandos, los shaders y el menú son los de RetroDECK, no los de la app: no se comparten con el navegador. Tampoco se cuenta el tiempo de juego.
- Al salir del juego vuelve a verse la Vista TV en Chromium.
- No está para los peques.
- Si no abre nada:
systemctl --user status jellycartoon-retrodeck.socketyjournalctl --user -u 'jellycartoon-retrodeck@*'en ese PC, y el Registro de la app.