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
Cobeña on a scooter: the town of Cobeña (Madrid) made of blocks to ride through on a scooter… and defend it from the Martians.
AI translation
Cobeña en patinete: el pueblo de Cobeña (Madrid) hecho de bloques para recorrerlo en patinete… y defenderlo de los marcianos
GamesJavaScript · CSSGitHub @jmlopezdonaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Videojuego web en 3D: el pueblo de Cobeña (Madrid) reconstruido calle a calle con ladrillos de juguete para recorrerlo montado en el patinete de las fotos de fotos_patinete/. El patinete del juego está modelado pieza a pieza a partir de esas fotos (largueros azules con agujeros, losetas grises, guardabarros gris, horquilla blanca en L, conectores negros, columna a rayas y manillar gris en T).Read the full README ↗
Videojuego web en 3D: el pueblo de Cobeña (Madrid) reconstruido calle a calle con ladrillos de
juguete para recorrerlo montado en el patinete de las fotos de fotos_patinete/. El patinete del
juego está modelado pieza a pieza a partir de esas fotos (largueros azules con agujeros, losetas
grises, guardabarros gris, horquilla blanca en L, conectores negros, columna a rayas y manillar
gris en T).
El callejero es el real: calles, casas, vallas, parques, piscinas y pistas salen de OpenStreetMap a escala 2 unidades de juego por metro. Cada personaje empieza la partida en su casa (Jose, en la calle Río Júcar, 44), y el skatepark está donde lo están construyendo de verdad: en la parcela de al lado de la rotonda de la M-103, al final de la calle.
Las cuestas también son las de verdad: el relieve sale del modelo digital del terreno del IGN (LiDAR), a la misma escala. Entre el arroyo y los cerros hay unos 100 m de desnivel, y calles como las del Olivar o Dalia se notan en las piernas.
npm install
npm run dev # abre http://localhost:5173
Para generar la versión lista para publicar en cualquier hosting estático:
npm run build # crea la carpeta dist/
npm run preview # la sirve en local para probarla
El servidor de desarrollo también escucha en la red local, así que se puede abrir desde una tableta o un móvil (hay controles táctiles) con la dirección «Network» que muestra Vite.
El juego es una aplicación web instalable (PWA): instalado se abre a pantalla completa, sin la barra del navegador, con su icono en la pantalla de inicio.
v1.0.N: los dos primeros números son los de
package.json y N los commits que lleva el juego, así que sube sola con cada publicación). El
juego instalado suele quedarse abierto días sin recargarse; por eso, al abrirlo, al volver a él y
al pausar pregunta si hay algo más nuevo y, si lo hay, un platillo lo avisa en el menú y en la
pausa con un botón para actualizar.src/game/news.js.Hace falta servirlo por HTTPS (GitHub Pages lo hace) o desde localhost. El service worker solo
se registra en la versión compilada (npm run build y npm run preview), no con npm run dev.
| Acción | Teclado | Mando |
|---|---|---|
| Conducir | W A S D o flechas | Stick izquierdo, gatillos |
| Saltar | Espacio | A |
| Turbo | Mayús | B |
| Truco del personaje (en el aire) | F | X |
| Giros en el aire | A / D | Stick |
| Backflip / frontflip | pulsar S / W en el aire | — |
| Empezar minijuego | E | Y |
| Día / noche (de noche: ¡marcianos!) | N | — |
| Soltarse del rayo abductor | machacar Espacio | A |
| Usar el objeto que llevas (timbre, gorro, cohete, luna) | Q | RB |
| Rayo del platillo robado | mantener Espacio | A |
| Esquivar al municipal y la zapatilla | Espacio justo a tiempo | A |
| Cámara cerca / lejos | C | Select |
| Color del vehículo | V | — |
| Modo foto | T | — |
| Recolocarse | R | — |
| Sonido | M | — |
| Pausa | Esc | Start |
Para hacer grind, salta y cae sobre una barandilla del skatepark.
El volumen de la música, los efectos y las voces se ajusta por separado en Sonido, tanto en el menú principal como en la pausa, y se guarda con la partida.
En el menú principal (o con «Personaje» en la pausa) se elige quién sale a la calle. Cada uno sale de su casa, lleva su vehículo y se conduce distinto:
| Personaje | Su casa | Vehículo | Cómo va | Su truco (F en el aire) | |
|---|---|---|---|---|---|
| 🏀 | Jose | Calle Río Júcar, 44 | Patinete | El de siempre: equilibrado | Tailwhip |
| 🥁 | Adrián | Calle Libertad, 17 | Monopatín | Gira fino y tiene buen ollie. Se impulsa con el pie y luego va de lado | Kickflip |
| 🤹 | Yago | Calle Río Guadiana, 17 | Monociclo | Gira sobre una moneda y salta más que nadie, pero corre menos | Pirueta |
| 🧤 | Teo | Avenida Río Guadalquivir, 39 | Bicicleta | Más velocidad punta y buenos saltos | Tailwhip |
| 🤳 | Emma | No vive en Cobeña: la puerta del parque El Palmeral | Patines | Arranca y gira como nadie; con turbo se agacha con las manos a la espalda | Espagat |
| ⚡ | Iker | No para en casa: una calle cualquiera, distinta cada vez | Patinete eléctrico | El que más corre, sin dar una patada; a cambio pesa, y salta y gira peor | Tailwhip |
| 🎾 | Leo | La puerta del centro de salud (el consultorio local) | Patinete | De blanco de arriba abajo. Un patinete de calle de los de toda la vida (tabla baja, ruedas pequeñas y manillar en T), más ligero que el de Jose: arranca antes y salta más, con algo menos de punta | Tailwhip |
Al elegirlo en el menú, el personaje aparece en la puerta de su casa; en la pausa se cambia sobre la marcha, sin moverse del sitio. «Volver a casa» y el castigo de la abuela llevan a la casa del que se lleve en ese momento.
A Emma, que viene de fuera, la trae su padre: al elegirla en el menú el monovolumen gris oscuro llega por la avenida Río Guadalquivir y para junto a la puerta del parque El Palmeral, enfrente de la Pista Polideportiva; ella se baja con los patines puestos y, al empezar la partida, el padre se despide con la mano y sigue avenida adelante. Su «casa» es esa puerta.
Iker no sale de ninguna casa: al elegirlo en el menú aparece en un punto al azar del callejero, en mitad de una calle y por su carril, y ese punto hace de «casa» hasta que se le vuelve a elegir o se pulsa «Volver a casa», que lo manda a otra calle.
Leo sale de la puerta del centro de salud, de espaldas a la fachada del cartel, y allí vuelve con «Volver a casa».
Mientras llevas a un personaje, su doble desaparece del pueblo: Yago deja libre la pista de circo,
la batería de Adrián se queda sola y callada, a Teo lo sustituye otro portero, Emma deja de
hacerse selfies en el parque, Iker ya no se cruza contigo por las calles, la pista de tenis se queda vacía, sin Leo ni su
máquina, y el padre de Jose se queda tirando
solo a canasta, sin Jose. El color de
cada vehículo se cambia con V y se guarda por separado.
En el campo del Mega Salto, al sur del camino de tierra, hay un gallinero. De día sus gallinas picotean por el corral y se apartan cacareando si pasas cerca; de noche duermen dentro.
De día, de tarde en tarde, el cielo avisa y caen cinco meteoritos en los descampados y campos que tengas cerca (nunca en las calles; si estás en pleno casco viejo, espera a que salgas).
De día no hay platillo, pero algunos marcianos se han quedado en Cobeña disfrazados de vecino: cada mañana se cuelan tres entre los peatones (el contador 🥸 lleva la cuenta). Se les reconoce porque les asoma una antena por encima del pelo, que no saben tener quieta.
Pulsa N (o «Día / noche» en la pausa) y, en cuanto oscurece, un platillo baja por el lado del
campanario y empieza a soltar marcianos de ladrillo por las calles.
F en el aire junto a uno).
Los golpes seguidos suben el multiplicador: doble, triple… culetazo galáctico.Espacio para soltarte. Si no, te lleva volando a otra punta del pueblo (la Isla del
Tesoro, la fuente de la plaza, la bolera…) y te birla unos studs.Espacio
pulsado, el rayo se traga a los marcianos que pilla debajo (cuentan para la oleada) y, de paso,
a los vecinos, los coches y las vacas, que vuelven a su sitio al acabar el paseo. Los marcianos
huyen del platillo en cuanto lo ven en tus manos.Q: los marcianos de
alrededor se quedan unos segundos tontos perdidos, dando vueltas y viendo las estrellas, y
entonces el culetazo vale por cualquier lado. Si el platillo anda cerca, también se atonta.Romper mobiliario da studs, pero también calienta el ambiente. Cinco destrozos seguidos (atropellar peatones también cuenta) y aparece la primera estrella bajo el minimapa:
| Estrellas | Qué pasa |
|---|---|
| ★ | Sale el policía municipal a pie, pitando y dando el alto. Si te toca, multa de 200 studs |
| ★★ | Aprieta el paso y la multa sube (200 por estrella) |
| ★★★ | Saca su patinete oficial con rotativo azul: corre casi tanto como tú y ataja por otras calles. Si te pilla, acabas en la puerta de la Policía Local |
| ★★★★ | Va tan rápido como tú sin turbo. Último aviso |
| ★★★★★ | Llaman a la abuela, que corre más que nadie y lanza la zapatilla: teledirigida y con vuelta, como un bumerán. Zapatillazo = castañazo, 500 studs requisados y castigado a casa |
| Quién | Dónde | Qué hace | |
|---|---|---|---|
| 🤹 | Yago | Skatepark nuevo, en su pista de circo | Monociclo, malabares, piruetas y reverencia. Si te le echas encima, te salta con una voltereta |
| 🧤 | Teo | Pista Polideportiva | El portero de «Chut a Puerta»: rizos, gafas redondas y la camiseta de Argentina con sus tres estrellas |
| 🥁 | Adrián | Puerta de la Escuela de Música, en la calle Fuente el Saz | Doble bombo y flequillo a tazón. Cuanto más te acercas, más suena |
| 🏀 | Jose y el Padre de Jose | Pista de baloncesto más cercana a Río Júcar, 44 | Padre e hijo echando unas canastas: rueda de pases (de pecho y picados), pase y corte, alley-oops, mates colgándose del aro, triples y entradas. No las meten todas, y los canastones se celebran. Si llevas tú a Jose, su padre se queda tirando solo |
| 🏃♀️ | Ana, Cintia y Bea | Parques de al lado de Río Júcar, 44 | Footing dando la vuelta a los dos parques, las tres a la par, hombro con hombro. Con «🏃♀️ Seguir a las mamás», en la pausa, la cámara corre con ellas al son de su propia música, y cada poco se aleja para enseñar por dónde van (C cambia de vista: en diagonal, de frente, de lado o desde atrás; Esc vuelve) mientras tu personaje espera donde estaba |
| 🤳 | Emma | Parque El Palmeral, pasada la puerta | Selfies sin parar, con sus patines: posa, dispara, mira la foto y cambia de ángulo, rodeada de corazones. Si te acercas, se gira para sacarte de fondo, y a su espalda empieza «Selfie con Emma» |
| ⚡ | Iker | Por todo el pueblo, sin parar | Da vueltas por las calles con su patinete eléctrico, por su carril y eligiendo camino en cada cruce. Corre más que los coches; si te tiene delante, frena y toca el timbre |
| 🎾 | Leo | Pista de tenis | De blanco y con su raqueta, pelotea contra una máquina lanzapelotas: corre a por cada bola, la devuelve de derecha por encima de la red… y alguna se le queda en ella |
Todos salen en el minimapa con su icono.
Pulsa T (o «📷 Modo foto» en la pausa) y el tiempo se para: en pleno backflip, con los
ladrillos de un castañazo en el aire o con la zapatilla de la abuela a medio vuelo. La cámara
queda libre para buscar el encuadre.
| Qué | Ratón y teclado | Táctil |
|---|---|---|
| Girar alrededor del personaje | arrastrar | un dedo |
| Acercar y alejar | rueda | pellizco |
| Desplazar el encuadre | botón derecho (o Mayús + arrastrar), W A S D | dos dedos |
| Subir y bajar | E / Q | dos dedos |
| Esconder los controles | H (cualquier clic los devuelve) | «Ocultar» (un toque los devuelve) |
| Volver al encuadre inicial | R | «Restablecer» |
| Hacer la foto | Espacio | «📸 Hacer foto» |
| Salir | Esc o T | «Salir» |
N), quitar al
piloto y su vehículo para fotografiar solo el pueblo, y quitar el sello.E)| Minijuego | Dónde | Objetivo | |
|---|---|---|---|
| 🏁 | Gran Premio de Cobeña | Calle Río Júcar, delante del 44 | Vuelta al barrio de los ríos contrarreloj |
| 🛹 | Rey del Skatepark | Skatepark nuevo | 75 segundos encadenando trucos |
| 🎳 | Bolos Gigantes | Recinto Ferial | Tú eres la bola: 10 bolos en dos tiradas |
| 👽 | Bolos Marcianos | Recinto Ferial, de noche | Los bolos son marcianos y se apartan al verte venir: 10 en dos tiradas |
| 🍕 | Pizza Exprés | Plaza de la Villa | Repartir 5 pizzas antes de que se enfríen |
| ⚽ | Chut a Puerta | Pista Polideportiva | Meter goles empujando el balón |
| 👾 | Chut Marciano | Pista Polideportiva, de noche | Marcarle a un portero marciano con cuatro brazos, que sigue el balón y despeja a puñetazos: hay que chutar cruzado |
| 🤳 | Selfie con Emma | Parque El Palmeral, junto a Emma | Colarse de fondo en sus 12 fotos: ponerse a su espalda, dentro del abanico rosa, y que el flash te pille haciendo un truco |
En «Selfie con Emma» ella ya no se gira hacia ti: tras cada foto cambia de ángulo y el abanico del suelo marca dónde hay que estar para la siguiente (se enciende según se acerca el flash). Cada foto se lleva de uno a tres corazones: posando, saltando o con un truco (giro, el truco del personaje o voltereta). Repetir el truco de la foto anterior vale la mitad; cambiarlo en cada foto sube el multiplicador hasta ×3. Las fotos son de verdad, sacadas desde su móvil: se van colgando como polaroids bajo el marcador y, al acabar, el resultado las enseña todas: se pulsa la que se quiera (de entrada, la mejor) para guardarla o compartirla. La misión no está si juegas con Emma.
Cada uno da hasta 3 estrellas. El progreso (studs, estrellas, ladrillos dorados, récords) se guarda en el navegador.
src/lego/ — paleta, shader de ladrillos (studs y juntas dibujados por pieza), instanciado
masivo, constructor de piezas, patinete, minifiguras y modelos. vehicles.js añade el monopatín,
el monociclo, la bici y el Tesla.src/world/ — cobena-data.js (callejero ya procesado), cobena.js (suelo por capas, calles,
casas, vallas y mobiliario), landmarks.js (skatepark y demás lugares especiales) y terrain.js
(terreno analítico: rampas, quarter pipes, bowls… que usa la física).src/world/relief.js — el relieve (cobena-relieve.js son las cotas ya procesadas). El juego
sigue razonando en plano, con las alturas medidas desde el suelo, y el relieve se suma al
dibujar: lift(x, z) da la cota del terreno. El suelo se tiende sobre él, cada edificio se
asienta a la cota de su fachada con un zócalo, las vallas bajan a escalones y, justo antes de
pintar, cada objeto y la cámara suben a su cota (Game.render). El patinete solo lo nota como
pendiente. Donde hay rampas, pistas o porterías el terreno se allana, así los minijuegos y el
skatepark funcionan igual que en llano.src/game/ — jugador y física arcade, cámara, studs, escombros, tráfico, minijuegos,
entorno día/noche, HUD y minimapa. aliens.js lleva la invasión (marcianos, platillo, rayo,
rescates y el robo del platillo), disguise.js, los que se pasean de día disfrazados de vecino, heist.js, el ladrón de la estatua dorada, boss.js, la nave nodriza, items.js, los objetos que se recogen por la calle y se gastan
con Q (el timbre sónico, el gorro de aluminio, el cohete y la gravedad lunar), slime.js, los charcos de baba
verde, cows.js, las vacas que pastan junto al Mega Salto, hens.js, las gallinas del gallinero,
meteors.js, la lluvia de meteoritos y sus cráteres,
folks.js, los vecinos con nombre, y wanted.js, el nivel de búsqueda (el municipal, la abuela
y la zapatilla). walker.js es el paso a pie que comparten marcianos y perseguidores.
characters.js define los personajes elegibles y sus estadísticas (sus casas y puntos de salida
van en el callejero, en places.homes; la puerta del parque de Emma la pone y el
punto al azar de Iker sale de , el grafo de calles por el que también circula; la
puerta del centro de salud de Leo y su pista de tenis las pone también ), y
es el coche que la trae. es el modo foto:
cámara libre, filtros (van en la pasada final de ) y la captura a mayor resolución.npm run datos # reprocesa la descarga guardada en tools/.cache
npm run datos -- --descargar # vuelve a pedir los datos a OpenStreetMap (Overpass)
npm run relieve # reprocesa el relieve guardado en tools/.cache
npm run relieve -- --descargar # vuelve a pedir el modelo del terreno al IGN
tools/osm-cobena.mjs convierte los datos en bruto en src/world/cobena-data.js: ajusta cada
edificio a un rectángulo, estrecha las calles según el hueco real entre fachadas, quita las vallas
que cortarían el paso y calcula los circuitos de los coches, los paseos de los peatones y la carrera.
tools/relieve-cobena.mjs descarga el MDT05 (una cota cada 5 m) del servicio WCS del IGN, lo
suaviza y lo deja en src/world/cobena-relieve.js como una rejilla de cotas cada 20 m, con el
cero en la puerta de casa. Si cambian los límites del mapa en el callejero, hay que regenerarlo.
Datos del mapa © colaboradores de OpenStreetMap, bajo licencia ODbL. Relieve: MDT05 2015-2021 CC-BY 4.0 scne.es. Juego de fans sin relación con ninguna marca de juguetes.
landmarks.jsworld/streets.jslandmarks.jsdropoff.jsphoto.jsmain.jssrc/core/ — entrada (teclado, mando, táctil), audio sintetizado con WebAudio y utilidades.
install.js registra el service worker y pone el botón de instalar, y update.js enseña la
versión y avisa cuando se ha publicado otra (compara con el version.json que escribe
vite.config.js al compilar).public/ — manifest.webmanifest (nombre, iconos, pantalla completa y horizontal) y sw.js,
el service worker: la red manda siempre que la hay y lo ya cargado queda guardado para jugar sin
conexión. Los iconos de public/icons se dibujan con npm run iconos.tools/ — utilidades de desarrollo que abren el juego en Chrome sin cabeza para simular la
física, recorrer los minijuegos y sacar capturas (necesitan npm run dev en marcha y Google
Chrome instalado en la ruta habitual de macOS). npm run test:misiones también prueba la invasión,
a los vecinos, el nivel de búsqueda y el modo foto, y node tools/probe.mjs '<js>' [captura.png] evalúa una
expresión dentro del juego (o un guion entero con node tools/probe.mjs @guion.js).