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。 以下為已儲存的摘錄。
Juego web de "¿Quién soy?" para dos jugadores. Se elige con qué mundo jugáis —One Piece, Hunter × Hunter, Minecraft o The Binding of Isaac: Rebirth— y cada jugador elige en secreto, de la lista de ese mundo, lo que su rival deberá adivinar: un personaje en los dos primeros, un objeto en los otros dos. Por turnos, se hacen preguntas que se responden con Sí, No o A veces, hasta que alguien se atreve a arriesgar.檢視完整 README ↗
Juego web de "¿Quién soy?" para dos jugadores.
Se elige con qué mundo jugáis —One Piece, Hunter × Hunter, Minecraft o The Binding of Isaac: Rebirth— y cada jugador elige en secreto, de la lista de ese mundo, lo que su rival deberá adivinar: un personaje en los dos primeros, un objeto en los otros dos. Por turnos, se hacen preguntas que se responden con Sí, No o A veces, hasta que alguien se atreve a arriesgar.
Uno crea la sala, le dicta el código de cinco letras a la otra persona, y a jugar. Podéis estar en ordenadores distintos. El mundo lo elige quien crea la sala y quien entra con el código juega al mismo. De la sala se sale cuando quieras: se cierra para los dos y se vuelve a la pantalla de entrada.
✅ v6 terminada. Entra The Binding of Isaac: Rebirth con sus 715 objetos, los pasivos, los activos y los familiares del registro del juego. Es el primer mundo que no ha cambiado ni una línea de reglas, de servidor ni de interfaz: solo su lista, su entrada en el registro y su bloque de colores, que es justo lo que la v5 prometía.
✅ v5 terminada. Entra Minecraft con sus 1504 objetos, y con él se cae una palabra: lo que se elige ya no es un anime sino un mundo, porque Minecraft no lo es. Cada mundo dice además cómo se llama lo que tiene dentro, así que la interfaz no le llama personaje a un yunque.
✅ v4 terminada. El juego deja de ser solo One Piece. Se elige el mundo antes de crear la sala, entra Hunter × Hunter con 120 personajes escritos a mano, y cada uno tiene su emblema y sus colores. Añadir un tercero es añadir datos: su lista de personajes, su entrada en el registro y su bloque de colores.
✅ v3 terminada. El personaje se elige de un catálogo cerrado de 778 personajes en vez de escribirse a mano: se busca, se pulsa, y acertar se decide comparando identificadores. Se acabó fallar por escribir "Luffy" donde ponía "Monkey D. Luffy".
En la 3.1 se le añadió salir de la sala: hasta entonces solo se salía cerrando la pestaña o esperando a que caducara. Con el rival dentro se pregunta antes, porque salir le cierra la sala a él también.
✅ v2 terminada y desplegada. Dos personas juegan desde ordenadores distintos, con el secreto guardado de verdad en el servidor.
✅ v1 terminada y sustituida por la v2. Se jugaba en dos pestañas del mismo navegador, sin servidor.
Este repositorio empieza por la especificación, antes que por el código:
docs/ESPEC-V6.md — lo último construido.docs/ESPEC-V5.md, docs/ESPEC-V4.md,
docs/ESPEC-V3.md y docs/ESPEC-V2.md —
lo anterior, cuyos criterios siguen valiendo.docs/ESPEC.md — la v1, como registro.CLAUDE.md — reglas de trabajo dentro del repositorio.Una sola dependencia, ws, para los WebSocket del servidor.
npm install
npm start # sirve el juego y coordina las partidas en http://localhost:8000
npm test # todo, sin navegador y sin red de verdad
npm run catalog # vuelve a generar data/one-piece.json desde la API (rara vez)
npm run minecraft # vuelve a generar data/minecraft.json desde el registro del juego
npm run isaac # vuelve a generar data/binding-of-isaac.json, igual pero de Isaac
Para probarlo solo, abre dos pestañas: sessionStorage es propio de cada una, así que
cuentan como dos jugadores distintos.
El repositorio trae un render.yaml, así que en Render basta con
New → Blueprint, elegir este repositorio y confirmar: el plan gratuito, el
comando de arranque y la versión de Node ya vienen puestos. Cada git push a main
vuelve a desplegar.
En el plan gratuito el servicio se duerme tras 15 minutos sin recibir nada y tarda cerca de un minuto en despertar, así que la primera visita después de un rato se hace larga. Una partida en curso lo mantiene despierto, y cuando se duerme las salas ya habían caducado de todos modos.
Este juego no funciona en GitHub Pages, que solo sirve ficheros y no puede ejecutar el servidor que reparte las partidas.
El servidor manda. El navegador no aplica reglas: manda acciones y pinta lo que le contestan.
| Capa | Qué hace |
|---|---|
src/game/ | Reglas, el registro de mundos, los catálogos y la vista de cada jugador |
src/server/ | Salas, validación de lo que llega, y el servidor HTTP + WebSocket |
src/client/ | Conexión, sesión de la pestaña, selector de personaje e interfaz |
data/ | Un catálogo por mundo, y las correcciones a los nombres de One Piece |
scripts/ | Los scripts que generan catálogos |
Los catálogos son ficheros del repositorio, no llamadas a una API: el juego no sale a internet mientras se juega, así que si una fuente se cae, la partida sigue. Cada mundo tiene la suya:
| Mundo | De dónde salen los nombres |
|---|---|
| One Piece | La API de api-onepiece.com, con correcciones a mano para que regenerarla no las pierda |
| Hunter × Hunter | Escritos a mano, sin script detrás |
| Minecraft | Del registro del propio juego y del fichero de idioma español de Mojang |
| The Binding of Isaac | Del registro del propio juego y de su fichero de textos, que trae ocho idiomas y uno es el español |
Una prueba comprueba que todos cumplen las mismas reglas —identificador derivado del nombre, orden alfabético, sin repetidos y un objeto por línea—, los genere un script o los haya escrito una persona.
Tres cosas, y ninguna es código de reglas:
data/<mundo>.json, con un {"id","name"} por línea. El
identificador sale del nombre; si te equivocas, npm test te lo dice.src/game/worlds.js: nombre,
una línea que lo presente, cómo se llama lo que tiene dentro (personaje,
objeto…) y su emblema en SVG, dibujado con las clases del tema (bone, ink,
accent, hot) y sin colores propios.styles/main.css, colgando de
[data-world='<mundo>'].Ni las salas, ni las reglas, ni los mensajes que van por el cable cambian. Isaac, que
entró entero en la v6 con sus 715 objetos, tocó 24 líneas de src/ y todas eran
su propia entrada en el registro.
El personaje que te toca adivinar no sale nunca del servidor hasta que la partida termina. A diferencia de la v1, abrir las herramientas de desarrollo no sirve de nada.
Las partidas viven en memoria: si el servidor se reinicia, se pierden. Una sala abandonada caduca a los quince minutos, y se cierra en el acto si uno de los dos jugadores se sale.
Proyecto de fan, sin ánimo de lucro y sin relación con los propietarios de One Piece, de Hunter × Hunter, de Minecraft ni de The Binding of Isaac. No incluye arte ni material con derechos: la estética es original, emblemas incluidos.
De los nombres, solo son nombres: los de One Piece vienen de la API pública de api-onepiece.com con algunas correcciones propias, los de Hunter × Hunter están escritos a mano, y los de Minecraft y los de Isaac salen del registro de cada juego y de su fichero de textos oficial en español.