Underground 2 Revived
Chrome과 Firefox에서 Need for Speed Underground 2를 WebGPU로 두고 팬 프로젝트입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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>).