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 ↗Subí una imagen, se convierte automáticamente en un rompecabezas con piezas de "tabs" curvos, y se arma en tiempo real con quien quieras dentro de una sala compartida (código de 6 caracteres o enlace directo).
No hace falta correr ningún servidor propio — todo el tiempo real lo maneja
Firebase. La app no usa Firebase Auth: la identidad de cada jugador es un id
propio generado en el navegador (guardado en localStorage), suficiente para
presencia y para saber quién sostiene cada pieza.
lenovo-experiences.env.local tiene las credenciales del proyecto Firebase
lenovo-experiences (cuenta [email protected]), compartido
con otras apps de la empresa (game, espacio-inteligente, ap_game, etc.).
Probé el flujo real (crear sala, subir imagen) de punta a punta y no hace
falta tocar nada más:
".read": true, ".write": true en la raíz
de las reglas — eso ya cubre /rooms, así que no agregué ni cambié nada
ahí (evité tocar el archivo de reglas de un proyecto compartido).match /{allPaths=**} { allow read, write: if true; } que cubre cualquier ruta no listada
explícitamente — incluida rooms/{roomId}/image.jpg, que usa esta app.Es decir: subestimé al principio y pensé que hacía falta Auth anónimo y
reglas nuevas, pero verificando las reglas reales del proyecto no hace falta
ninguna de las dos cosas. Si en algún momento quisieran reglas más estrictas
específicas para /rooms (por ejemplo, limitar el tamaño de imagen en
Storage en vez de depender del catch-all abierto), dejo el snippet opcional
más abajo.
Si preferís separar esto a un proyecto Firebase propio (recomendable si este juego va a tener uso real, para no compartir cuota/facturación con producción), avisame y creo uno nuevo con el Firebase CLI.
.env.local ya está completo. Si en algún momento apuntás a otro proyecto
Firebase, copiá .env.local.example y completá cada valor con los datos de
firebaseConfig de ese proyecto (Configuración del proyecto → Tus apps →
app Web):
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_DATABASE_URL=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=
Mientras estas variables no estén completas, la app muestra un aviso de
"Falta configurar Firebase" en vez de romperse. Asegurate también de que ese
otro proyecto tenga Realtime Database y Storage creados, con reglas que
permitan leer/escribir bajo /rooms (ver snippet opcional más abajo) — esta
app no usa Firebase Auth, así que las reglas no pueden exigir auth != null
a menos que agregues autenticación vos mismo.
/roomsNo hacen falta en lenovo-experiences (ya queda cubierto por las reglas
abiertas existentes), pero si algún día querés limitar específicamente esta
app — por ejemplo tope de tamaño de imagen — podés sumar esto a las reglas
de Storage existentes, sin reemplazar las demás:
match /rooms/{roomId}/{fileName} {
allow read: if true;
allow write: if request.resource.size < 15 * 1024 * 1024
&& request.resource.contentType.matches('image/.*');
}
npm install
npm run dev
Abrí http://localhost:3000. Para probarlo con otra
persona en la misma red, usá la IP de tu máquina
(http://TU-IP-LOCAL:3000) o un túnel como ngrok http 3000.
Al crear una sala se puede elegir modo Competencia en vez de Colaborativo: Equipo Rojo 🔴 contra Equipo Azul 🔵, cada uno arma su propia copia del mismo rompecabezas (misma imagen y mismas piezas, pero posiciones independientes por equipo — no comparten tablero).
lib/puzzleGeometry.ts Generador determinístico de la forma de las piezas
lib/piecesRender.ts Recorta la imagen en bitmaps individuales por pieza
lib/room.ts Crear sala, subir imagen, piezas, equipos y estado de carrera
lib/presence.ts Jugadores conectados (Realtime Database + onDisconnect)
lib/firebase.ts Inicialización de Firebase (Database/Storage)
components/PuzzleStage.tsx Tablero interactivo (Konva): zoom, paneo, drag & drop
components/TeamPicker.tsx Selector de equipo (modo Competencia)
components/RaceBar.tsx Progreso dual, cronómetro y banner de ganador
app/sala/[roomId]/ Página de una sala
app/page.tsx Inicio: crear sala (colab/versus) / unirse a una sala