Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗La web está publicada en Vercel: https://el-baul-de-los-jogos.vercel.app/. El repositorio de GitHub está conectado para publicar cada cambio automáticamente. Supabase guarda los juegos, lugares, amigos y grupos por usuario. El acceso es con correo electrónico y una contraseña propia de la aplicación; no requiere Google Cloud.
En el SQL Editor de tu proyecto, ejecuta el contenido de sql/schema.sql. Crea las tablas y sus políticas Row Level Security para que cada persona solo acceda a sus propios datos.
Ejecuta también sql/unique-game-names.sql. Elimina duplicados de juegos con el mismo nombre dentro de cada colección, conserva el registro más antiguo y crea una restricción única por usuario y nombre (ignorando mayúsculas y espacios exteriores).
Ejecuta también sql/user-features.sql, que añade amigos reutilizables, perfiles con apodos únicos, grupos compartibles y la lista común de próximas compras. Después ejecuta sql/bootstrap-admin.sql para dar rol de administrador a [email protected] (esa cuenta debe haberse registrado antes).
En Authentication → Sign In / Providers → Email, deja habilitado el acceso por correo y permite crear usuarios. Mantén la confirmación del correo activada para verificar la dirección. Usa una contraseña de la ludoteca, distinta de la de Gmail.
En Authentication → URL Configuration, usa https://el-baul-de-los-jogos.vercel.app como Site URL y añade https://el-baul-de-los-jogos.vercel.app/** a Redirect URLs. Para que funcionen también las previsualizaciones de ramas, añade https://*-deus20.vercel.app/**. Al crear la cuenta, Supabase enviará un correo de confirmación. El envío de prueba de Supabase tiene límites; si el mensaje no llega a tu dirección, configura un proveedor SMTP propio.
En Connect o Settings → API Keys, copia la Project URL y la Publishable key (sb_publishable_...). Copia public/supabase-config.example.js como public/supabase-config.js y pega los valores:
window.LUDOTECA_SUPABASE = {
url: "https://TU-PROYECTO.supabase.co",
publishableKey: "sb_publishable_TU_CLAVE"
};
La publishable key puede publicarse en el navegador; Row Level Security protege los datos. Nunca incluyas una secret o service_role en la web.
En Vercel, añade estas variables de entorno en Settings → Environment Variables: SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY y SUPABASE_SECRET_KEY. La última es la clave sb_secret_... y solo la utilizan las funciones de /api; nunca la pegues en supabase-config.js ni la subas al repositorio.
Publica public/supabase-config.js en la rama main. Vercel se actualizará automáticamente al subir cambios a main. Al iniciar sesión por primera vez, la aplicación sube la colección local si todavía no hay datos en la cuenta.
La página login.html permite crear una cuenta con correo, contraseña y apodo único, e iniciar sesión con el correo o el apodo. La página incluye recuperación de contraseña. Ejecuta sql/community-plays.sql en el SQL Editor de Supabase para activar las fotos de perfil (incluye profile-appearance.sql), compartir grupos con amigos vinculados, los avisos de «te ha añadido como amigo», las partidas con notas por persona y el guardado incremental (solo se envían los cambios). Sin ese script la app sigue funcionando con el guardado antiguo. La pestaña Partidas organiza las partidas por grupo, con estadísticas, puntos, ganadores y la nota que cada participante pone desde su cuenta. La apariencia del tema se ajusta desde el menú de perfil y, por defecto, sigue el tema del dispositivo. La sección Amigos guarda contactos reutilizables en distintos grupos; cada grupo puede compartirse con una cuenta usando su correo. Si el nombre de un amigo coincide con el apodo de una cuenta, se vincula a ella; si no, la app ofrece un enlace de invitación al registro con un apodo propuesto y vincula al amigo cuando se registra con ese apodo (usa /api/friend-lookup). La página admin.html permite al administrador revisar usuarios y suspender o restaurar cuentas. Cuando Supabase está conectado, la colección requiere iniciar sesión y se sincroniza por usuario. La clave antigua anon también es compatible. En modo local, abre index.html?local=1.
La página de administración muestra las visitas de los últimos 30 días (Vercel Web Analytics, solo la web de producción). Para activarlas:
VERCEL_ANALYTICS_TOKEN con ese token, marcado como Sensitive, para Production y Preview. Después, vuelve a desplegar.La función api/analytics.js usa ese token en el servidor; el navegador nunca lo ve.
La app está hecha con Vite + TypeScript + Svelte (src/). Lee docs/ARQUITECTURA.md para entender las capas, las ramas (dev → main) y los tests, y docs/DECISIONES.md para saber por qué se eligió cada cosa.
npm install
npm run dev # http://localhost:5173/?local=1
npm run check && npm test # tipos y tests unitarios
npm run test:integration # app + Postgres en Docker con todas las migraciones
public/supabase-config.js contiene la URL y la clave pública de Supabase.
Los logos originales están en assets/logo-original/. Si cambian, ejecuta python scripts/brand-assets.py para regenerar los iconos de la web (public/brand/) y de la APK (assets/); la APK aplica el icono al compilarse.
La app compilada va dentro de la APK (Capacitor, webDir: dist), así que abre sin conexión con la última copia guardada; para sincronizar necesita Internet. Se entra con el mismo correo o apodo y contraseña que en la web.
Cada push a dev o main genera una APK firmada en GitHub: Actions → Build Android APK → Artifacts → el-baul-de-los-jogos--apk. Todas se firman con la misma clave (secretos ANDROID_KEYSTORE_BASE64 y ANDROID_KEYSTORE_PASSWORD del repositorio), así que cada versión se instala encima de la anterior. El dueño guarda una copia de la clave fuera del repositorio: sin ella no se puede volver a actualizar la app. El mismo flujo prueba la APK en un emulador y guarda capturas (android-screenshots-<rama>).