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。 以下為已儲存的摘錄。
Simulador ferroviario 3D del Metro de Santiago: líneas 1, 2, 3, 4, 4A, 5 y 6 para navegador, hecho con HTML, CSS, JavaScript y Three.js. Conductor y pasajero comparten el mismo mundo: los mismos trenes, señales, horarios y viajeros. Los módulos ES necesitan un servidor local (no funciona abriendo index.html con doble clic). • VS Code: extensión Live Server → clic derecho en index.html → Open with Live Server. • Node: npx serve . y abrir la dirección que indique. Three.js se carga desde CDN, así que la primera vez hace falta conexión a internet.檢視完整 README ↗
Simulador ferroviario 3D del Metro de Santiago: líneas 1, 2, 3, 4, 4A, 5 y 6 para navegador, hecho con HTML, CSS, JavaScript y Three.js.
Conductor y pasajero comparten el mismo mundo: los mismos trenes, señales, horarios y viajeros.
Los módulos ES necesitan un servidor local (no funciona abriendo index.html con doble clic).
index.html → Open with Live Server.npx serve . y abrir la dirección que indique.Three.js se carga desde CDN, así que la primera vez hace falta conexión a internet.
dist/MetroSim.apk instala el juego como app de Android (funciona sin internet). Se reconstruye con
python3 android/build/build.py; detalles en android/LEEME.md.
MetroSim es instalable: en la pantalla inicial aparece 📲 Instalar MetroSim (Chrome, Edge, Android). En iPhone/iPad:
Compartir → Agregar a inicio. Se abre a pantalla completa y, tras la primera partida con internet, funciona sin conexión
(el service worker sw.js guarda el juego, Three.js y las voces). La instalación necesita https o localhost.
Los íconos están en icons/ (los PNG se generan desde icons/icon.svg).
Encuentros con otros viajeros (js/encounters.js): cada uno o dos minutos pasa algo que pide una decisión.
Quien lo protagoniza es uno de los viajeros dibujados, marcado con un ícono flotante; acércate y pulsa E
(o F para ceder el asiento):
js/routeQuiz.js): pregunta cómo llegar a otra estación. Elige la indicación correcta
(línea, dirección y, si hace falta, dónde combinar), calculada con la red real. Si aciertas te deja una propina;
si te equivocas, se va por el camino equivocado.Civismo (js/civics.js): ayudar suma puntos (equivocarte con el turista resta) y subes de nivel: Buen
vecino, Pasajero ejemplar y Orgullo del Metro, cada uno con un premio en tu cuenta. Se ve en la libreta de
misiones (J).
Mapa de la misión: bajo la misión activa hay una brújula que apunta al lugar del paso actual, con la distancia, qué es y cómo llegar (boletería o tótem, acceso al Metro, torniquetes, escalera al andén del sentido correcto, salida a la calle, el local o el hito), y una línea con tu posición y el destino. El destino también se marca en el esquema de línea de arriba. A bordo te dice cuántas estaciones faltan o si vas en sentido contrario.
Sin dinero: si no te alcanza para el pasaje ni para cargar la bip!, aparece el botón «Sin dinero · ir a Conductor» que te lleva a conducir (en la línea actual si tienes su licencia; si no, en la Línea 3) para ganar tu sueldo.
Volver al menú desde el modo Pasajero (botón Menú o gesto/botón «atrás» del celular) pide confirmación (Esc, «Seguir jugando» u otro «atrás» cancela; Enter confirma).
Salir por los torniquetes es gratis: solo se cobra el pasaje al pasar hacia la zona pagada (antes, al terminar de cruzar el torniquete de salida se cobraba un pasaje).
js/engine/fleet.js): las líneas 1, 2 y 5 usan trenes de neumáticos de Alstom
(NS-74, NS-93, NS-2007, NS-2016) y las 3, 4, 4A y 6, de rueda de acero (AS-2002 de Alstom, AS-2014 de CAF).
Cada línea tiene su mezcla de modelos y a cada servicio le toca uno (la L5 conserva casi la mitad de su flota de
NS-74, de 1975). Cambia la física: el neumático agarra mucho más (arranca y frena fuerte) pero rueda con más
resistencia; los trenes antiguos aceleran menos, el NS-74 frena con resistencias (sin freno regenerativo) y
ninguno de neumáticos tiene pantógrafo: toman 750 V de las barras guía que se ven a los costados de la vía,
junto a las pistas de rodadura. Al empezar a conducir te dice qué tren te tocó y la DMI lo muestra.js/engine/sections.js, js/render/outdoor.js): la L4 corre en viaducto sobre
Vicuña Mackenna y en trinchera por Américo Vespucio, la L4A en trinchera por Vespucio Sur, la L5 en los viaductos
de Pudahuel-Maipú y de Vicuña Mackenna y la L2 en trinchera junto a la autopista Central (tramos aproximados).
Al aire libre se ve el cielo según la hora, la avenida con autos, veredas, árboles, faroles y edificios (con
ventanas encendidas de noche), pilas con capitel bajo el viaducto, muros y puntales en la trinchera, pórticos de
catenaria y portales de túnel. Las estaciones al aire libre tienen el andén abierto con mamparas de vidrio y
cubierta liviana. El perfil cambia: en viaducto la vía va ~9 m sobre la calle y en trinchera ~7 m bajo ella.js/engine/weather.js): por defecto, el tiempo real (se consulta a Open-Meteo, un
servicio público sin clave; sin conexión, uno típico de la temporada: en Santiago llueve casi solo de mayo a
agosto). También se puede elegir en la portada: despejado, nublado, lluvia o temporal. Con lluvia, en los tramos
al aire libre el riel mojado agarra mucho menos: el tren patina al arrancar y desliza al frenar (la DMI
avisa y el antipatinaje recorta el esfuerzo), así que hay que frenar antes. Además viaja más gente (y con frío,
algo más). Se ve la lluvia (también en la calle del pasajero), el cielo gris y se oye.js/engine/express.js): en la L2, la L4 y la L5, los días laborales de 06:00 a 09:00 y de
18:00 a 21:00 los trenes alternan ruta roja y ruta verde y se saltan las estaciones del otro color
(las comunes las sirven todos). Colores de 2023. El horario de cada servicio se calcula con la marcha sin
parar por las saltadas, en las estaciones de un color pasa un tren cada dos y los letreros de las estaciones
muestran su color. El conductor ve "PRÓXIMA PARADA · RUTA VERDE" y qué estaciones pasa sin detenerse (abrir
puertas en una que no le toca es falta); las pantallas del andén marcan el color de cada tren y el pasajero
recibe el aviso al llegar. Mientras funciona, la regulación no retiene a los trenes expresos (sus intervalos
son desiguales por diseño): se rigen por su horario.Siguen siendo simplificaciones: todos los trenes se dibujan con la composición de 5 coches y ~120 m del AS-2014 (para que andenes, puertas y viajeros funcionen igual) y la calle del modo pasajero queda sobre su estación aunque esta vaya en viaducto.
js/roles/driverSafety.js (vigilancia, ATP y PCC, personal en la vía); el bloqueo de tracción y la marcha
a la vista viven en la simulación del tren (js/engine/sim.js).js/render/carInfoPanel.js): próxima estación y combinaciones, estación actual,
"CIERRE DE PUERTAS" parpadeando, la hora y la dirección. Las del lado del andén avisan "SE ABRIRÁN LAS PUERTAS DE
ESTE LADO". Avisan también si el tren está detenido o si se retira del servicio. El plano luminoso de la línea sigue
marcando la próxima estación.carShares / carLoads en js/engine/passengers.js): van más llenos los coches que
quedan junto a la escalera del andén y más vacíos los del otro extremo. Los asientos y el "no cabes" se cuentan por
coche: si el de tu puerta va repleto, prueba otra puerta. El HUD muestra cuántas personas van en tu coche
(holgado, cómodo, lleno, apretado, repleto).js/engine/incidents.js): un tren puede detenerse en plena vía por regulación de
frecuencia, por un tren detenido más adelante o por inspección de vía. A los pocos segundos lo anuncia la megafonía
("Estimados pasajeros, nuestro tren se encuentra detenido…") y al seguir: "Reanudamos la marcha". Si un tren queda
detenido sin motivo informado (una señal en rojo), también hay aviso. El HUD muestra el retraso respecto del horario.js/render/trackLift.js): el túnel baja y sube entre
estaciones, cada estación queda a su altura y los trenes se doblan siguiendo la vía coche a coche. La lógica
del juego sigue en un mundo plano; lo que se dobla es el dibujo, en la tarjeta gráfica, con una textura de
cotas de la línea (una muestra cada 2 m), así que casi no cuesta rendimiento. En la cabina y a bordo la cámara
cabecea con el tren al entrar en una rampa. La calle no se dobla: queda horizontal a la altura de su estación.js/engine/profile.js) con el terreno de Santiago subiendo
hacia la cordillera, estaciones a nivel, trazado en "diente de sierra" entre estaciones (máx. 35 ‰) y túnel más
hondo bajo el río Mapocho. La pendiente se siente en la física y se ve en la DMI.Los datos oficiales usados son los del AS-2014 (5 coches, 120 m, 1.299 personas, 80 km/h), la longitud de la L3 y el horario de funcionamiento; masas, esfuerzos, potencias, demanda e intervalos son valores aproximados coherentes con un metro moderno de este tamaño.
js/city/catalog.js.Puntaje del conductor: cada estación suma puntos por precisión de parada, puntualidad y confort (sin tirones ni paradas bruscas). Las estaciones perfectas seguidas forman una racha (hasta ×2). Las faltas restan. Al final del servicio, nota S/A/B/C/D y récord guardado por línea y sentido.
Incidentes aleatorios: puertas obstruidas (se reabren y hay que volver a cerrar), limitaciones temporales de velocidad por trabajos o inspección de vía y fallas de señal (queda en rojo un tiempo). Afectan a todos los trenes, avisan al conductor y al viajero, y quedan en el registro del Centro de Control.
Elige tu línea en la pantalla principal (conductor y pasajero): L1, L2, L3, L4, L4A, L5 o L6, cada una con su mundo 3D, sus estaciones reales en orden, sus combinaciones, su color y sus carteles. El resto de la red sigue funcionando a la vez (sin dibujo) y se conecta por las combinaciones. Las distancias son aproximadas y, por simplicidad, todas las líneas se representan subterráneas.
Las 21 estaciones reales de la L3 (Plaza Quilicura ⇄ Fernando Castillo Velasco) con sus combinaciones.
Doble vía con trenes automáticos en ambos sentidos según horario.
Trenes AS-2014 de 5 coches con intercirculación, pantógrafos y catenaria rígida.
Señalización de bloqueo automático de 3 aspectos y protección por rebase de señal en rojo.
Estaciones con andenes laterales, escaleras, mezanina con torniquetes (tarjeta bip!), boletería y salida a la calle.
Viajeros que entran desde la calle, validan, esperan en su andén, suben, viajan y bajan.
Escaleras mecánicas de subida junto a las escaleras fijas.
Tarjeta bip! con saldo persistente: el torniquete cobra según el tramo horario (punta, valle, baja); carga en la boletería (con cajero y fila) o en los tótems de autoservicio.
Maniobra de retorno en las terminales: cola de maniobras, cambio de cabina y cambio de vía (jugador y trenes automáticos).
Sonido procedural, anuncios de estación con voz y megafonía de andén.
Hora local real: la partida empieza a la hora de tu computador y el reloj se mantiene sincronizado.
Pantallas de próximo tren en tres puntos de cada andén y plano de línea dinámico en los coches (luz parpadeante en la estación actual o la próxima).
Bancos en los andenes para esperar sentado; nadie atraviesa columnas, bancos ni a otros viajeros.
En las terminales, el andén de llegada es solo de salida.
Las tarifas son valores de referencia configurables en
js/config.js(FARES); revísalos si quieres que coincidan con las vigentes.
Acceso completo y gratis para el creador del juego: toda la Tienda Metro desbloqueada (licencias, libreas, contratos, depto con muebles y recuerdos) y compras, pasajes y cargas sin costo. Tu saldo y lo que compraste de verdad no se tocan.
node tools/clave-creador.mjs "una frase larga y secreta"?creador al final de la dirección y escribe la clave. Queda activo en ese navegador.?creador=off.Conductor
| Tecla | Acción |
|---|---|
| W / ↑ · S / ↓ | Subir / bajar mando (P4 … B3, EM) |
| Espacio | Freno de emergencia |
| Q · E | Inversor adelante / atrás |
| D | Abrir / cerrar puertas |
| B | Bocina (obligatoria al pasar junto al personal en la vía) |
| X | Confirmar la vigilancia (hombre muerto; mover el mando también cuenta) |
| V · C | Vista exterior · centrar vista |
| T | Cambio de cabina (en el cartel FIN DE MANIOBRA) |
| R | Reiniciar servicio |
| F | Finalizar turno antes de la terminal (pulsa dos veces; muestra el resumen) |
Pasajero a pie
| Tecla | Acción |
|---|---|
| W / ↑ · S / ↓ | Caminar hacia adelante · retroceder despacio (Shift: correr) |
| A / ← · D / → | Girar |
| Re Pág · Av Pág | Mirar arriba / abajo (al caminar la vista vuelve sola al frente) |
| F | Sentarse / levantarse (en el tren o en un banco del andén) |
| G | Agarrarse de una barra / soltarse (a bordo, de pie) |
| E | Boletería, tótem, salida a la calle · en la calle: entrar a un local, bajar al Metro o sacar una foto del hito |
| J | Misiones |
Ambos: M sonido · H ayuda.
Celular o tablet: aparecen controles táctiles (mejor con el teléfono en horizontal; en Android el juego pasa a
pantalla completa y horizontal al empezar). Los controles son mínimos: lo que sirve en un momento puntual aparece solo
entonces y lo poco usado va en el menú ☰ (arriba a la derecha). Conductor: indicador de mando e inversor (tocar la letra
F / N / R cambia el inversor), ▲ / ▼ mando y EMERGENCIA abajo a la izquierda; 🚪 Puertas abajo a la derecha; ✋ Vigilancia
solo cuando suena la alarma de hombre muerto y ⇄ Cambiar cabina solo detenido en FIN DE MANIOBRA; en ☰ Bocina, Vista,
Tienda y Finalizar turno; arrastra la pantalla para mirar. Pasajero: joystick abajo a la izquierda para caminar (al
borde corre), arrastra a la derecha para mirar, 🎯 Misiones siempre y ✋ Usar, 🪑 Sentarse y 🤚 Agarrarse solo donde se
puede; en ☰ Tienda y Menú principal. El HUD se compacta en pantallas chicas y respeta la muesca del teléfono; en el
Centro de Control los esquemas se desplazan de lado y la ficha del tren aparece como hoja inferior.
Para probarlos en el computador, abre la página con ?touch=1 al final de la dirección.
MetroSim separa el motor (el "cerebro" del Metro) del render (lo que se ve).
El motor simula toda la red (7 líneas) con un único reloj. La línea que eliges se construye en 3D; las demás se simulan sin dibujo. Se conectan en sus combinaciones (Universidad de Chile, Baquedano, Los Héroes, Tobalaba, Ñuñoa…): parte de la gente que baja de una línea sigue viaje por otra, así que un problema en una se nota en las demás. En una estación de combinación, el HUD del pasajero muestra los próximos trenes de las otras líneas.
ENTRADA DEL JUGADOR → MOTOR METROSIM → ESTADO DE LA RED → RENDER 3D / INTERFAZ / AUDIO
El motor (js/engine/) no usa Three.js ni el navegador: los trenes circulan con su propio reloj de paso fijo,
los mire el jugador o no. Cada tren tiene un estado explícito (arrancando, circulando, aproximándose,
puertas abiertas, listo para salir, detenido ante señal...) y las pantallas de "próximo tren" se calculan desde
la posición real de cada tren, no solo desde el horario. El juego escucha al motor por su bus de eventos
(train:created, train:removed, train:event, train:state...).
Los roles no tocan la simulación: mandan órdenes al buzón del motor y este decide si se pueden cumplir.
El Conductor convierte sus teclas en órdenes (driver.notchUp, driver.doors...). Desde la consola del
navegador se pueden dar las mismas órdenes que el Centro de Control:
MetroSim.game.engine.command("control.hold", { trainId: "L3-1405" }) // retener en su próxima estación
MetroSim.game.engine.command("control.hold", { trainId: "L3-1405", seconds: 60 }) // …durante 60 s
MetroSim.game.engine.command("control.release", { trainId: "L3-1405" }) // liberarlo
MetroSim.game.engine.command("control.skip", { trainId: "L3-1405" }) // pasar sin parar por la próxima parada
MetroSim.game.engine.command("control.withdraw", { trainId: "L3-1405" }) // retirarlo del servicio
MetroSim.game.engine.command("control.authorize", { trainId: "L3-1405" }) // rebasar en marcha a la vista una señal averiada
MetroSim.game.engine.command("control.resume", { trainId: "L3-1405" }) // seguir tras una detención en la vía
Al retener un tren, el siguiente se queda detenido ante la señal en rojo: causa y efecto.
Los pasajeros también son cifras reales del motor: llega gente a cada andén según la hora y la estación (las de combinación mueven más), en cada parada primero bajan y luego suben a un ritmo limitado por las puertas, y el tren no cierra mientras haya intercambio. Un tren atrasado encuentra más gente, tarda más y se atrasa más; el de atrás va más vacío (trenes en racimo). Los viajeros dibujados son solo una muestra de esas cifras.
La regulación de intervalos lo corrige como un Puesto de Mando: retiene unos segundos en la estación al tren
que va demasiado pegado al de delante (respetando la proporción del horario) y acorta la parada del que va con
mucho hueco. Tras retener un tren 5 min en punta, el intervalo mínimo en Universidad de Chile pasa de 86 s sin
regulación a 170 s con ella. Se puede apagar desde la consola (engine.command("control.regulation", { on: false }))
o en la simulación sin gráficos con node tools/simular.mjs 10:00 15 "UNIVERSIDAD DE CHILE" sin-regulacion.
Se puede ejecutar sin gráficos:
node tools/simular.mjs # 08:00 → 10:00, informe cada 15 min
node tools/simular.mjs 09:30 5 # hasta las 09:30, informe cada 5 min
node tools/simular.mjs 09:00 10 "ÑUÑOA" # pantallas de andén de otra estación (L3 y L6)
(Requiere Node 22 o superior.)
index.html pantallas y HUD
styles.css estilos
manifest.webmanifest manifiesto de la app instalable (PWA)
sw.js service worker: instalación y juego sin conexión
icons/ íconos de la app (icon.svg y PNG generados)
js/engine/ MOTOR (sin Three.js)
engine.js MetroEngine: red de líneas con un reloj común; informe de estado
network.js las 7 líneas de la red (estaciones reales) y combinaciones
clock.js reloj de paso fijo
route.js los dos sentidos de circulación
schedule.js horarios
signals.js lógica de señalización de bloqueo automático
sim.js física del tren y conducción automática
traffic.js todos los trenes de la línea, maniobras y retrasos
consist.js composición del AS-2014 (5 coches, 20 puertas por lado) y sus datos físicos
fleet.js flota real de cada línea: modelos de neumáticos y de acero y su física
sections.js tramos en túnel, trinchera o viaducto
weather.js clima: lluvia (adherencia al aire libre) y demanda
express.js Ruta Expresa (rutas roja y verde) de las líneas 2, 4 y 5
profile.js perfil longitudinal: cotas y pendientes de cada línea
state.js estado explícito de cada tren
eta.js llegadas estimadas desde la posición real
commands.js buzón de órdenes (roles → motor)
passengers.js pasajeros lógicos: demanda, subidas y bajadas
regulation.js regulación de intervalos (retener / apurar trenes)
events.js bus de eventos del motor
format.js utilidades puras
js/render/ dibujo del estado del motor
trainViews.js trenes
signalViews.js señales
lineMapPanel.js plano de línea dinámico de los coches
carInfoPanel.js pantallas de información sobre las puertas de los coches
trackLift.js pendientes en 3D: dobla el dibujo de la vía según el perfil de la línea
outdoor.js al aire libre: viaductos, trincheras, la avenida y los edificios, cielo y lluvia
js/control/ Centro de Control
controlCenter.js esquema de la red, ficha de tren, alarmas, órdenes, tiempo, informe del turno
alarms.js mesa de alarmas (incidentes que piden una decisión) y nota del turno
controlTutorial.js pasos del tutorial del Centro de Control
js/encounters.js encuentros del Pasajero con otros viajeros (asiento, turista, objeto, vendedor, músico, citófono)
js/routeQuiz.js preguntas de ruta del turista (con la red real)
js/civics.js civismo del Pasajero: puntos, niveles y objeto olvidado que llevas
js/touch.js controles táctiles (celular y tablet)
js/roles/ roles del jugador
driverRole.js Conductor: teclado → órdenes
driverSafety.js Conductor: vigilancia (hombre muerto), ATP y PCC por radio, personal en la vía
js/stationLayout.js columnas, bancos y pantallas de los andenes (compartido)
js/main.js punto de entrada: une motor, render, roles, interfaz y audio
js/config.js línea, estaciones, geometría, mando, tarifas, demanda
js/world.js túnel, vías, catenaria y estaciones con mezanina
js/train.js modelo 3D del tren de 5 coches y cabina
js/dmi.js pantalla de cabina
js/people.js viajeros (NPC) instanciados
js/walker.js pasajero a pie
js/audio.js sonido procedural y megafonía
js/announcements.js frases reales de megafonía del Metro de Santiago
js/camera.js vistas del conductor
js/hud.js interfaz (incluye boletería y tótem)
js/card.js tarjeta bip! del jugador
js/economy.js cuenta bancaria (débito), sueldo del conductor y bono de servicio
js/missions.js misiones del pasajero (sin Three.js)
js/tutorial.js tutorial interactivo del jugador nuevo (conductor y pasajero)
js/city/ la calle de cada estación
plan.js locales de cada estación y lo que venden (sin Three.js)
catalog.js hitos de las estaciones (sin Three.js)
landmarks.js modelos procedurales de los hitos
kit.js piezas de ciudad: fachadas, árboles, faroles, letreros
city.js la calle 3D: avenida, autos, peatones, locales, cielo
js/intro.js introducción de bienvenida
js/pwa.js registro del service worker y botón "Instalar MetroSim"
js/creator.js Modo Creador (todo desbloqueado y gratis, con clave)
js/utils.js utilidades y texturas procedurales
tools/simular.mjs ejecuta el motor sin navegador
Las distancias entre estaciones son aproximadas; los nombres, el orden y las combinaciones son los reales.
node tools/simular.mjs 10:00 15 "VICENTE VALDÉS" con-regulacion laboral lluvia simula también con lluvia.node tools/simular.mjs 09:00 15 "ÑUÑOA" "" sabado simula también sábados y domingos.