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,即可验证所有权并自行管理介绍。
一分钟完成验证Videojuego de Reptiles Cartas
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
🦎 REPTILES RPG Game Balance System & Arena de Combate en Tiempo Real Un videojuego de cartas por turnos con 40 reptiles reales, 8 afinidades tipo piedra-papel-tijera, combate multijugador en vivo entre dispositivos distintos, IA con decisiones reales, y un motor de balance profesional detrás de cada número.查看完整 README ↗
Un videojuego de cartas por turnos con 40 reptiles reales, 8 afinidades tipo piedra-papel-tijera, combate multijugador en vivo entre dispositivos distintos, IA con decisiones reales, y un motor de balance profesional detrás de cada número.
🎮 Modos de juego · 🐍 Afinidades · ⚔️ Motor de combate · 🌐 Multijugador en vivo · 🛠️ Instalación
Reptiles RPG es dos cosas en un mismo proyecto:
Ambas mitades comparten el mismo motor: el daño que ves en una batalla online contra otro jugador es exactamente el mismo número que calcularía el simulador de diseño. No hay dos fuentes de verdad.
flowchart LR
A[🏠 Portada animada] -->|⚔️ JUGAR| B[Bienvenido a la Arena]
B --> C[🤝 Crear con amigo]
B --> D[🔑 Unirse con código]
B --> E[🎲 Partida aleatoria]
B --> F[🤖 Contra la IA]
B --> G[📱 Este dispositivo]
C --> H[Sala de espera<br/>código de 6 caracteres]
D --> I[Ingresá el código]
I --> H
H -->|rival se une| J[3-2-1 ¡BATALLA!]
E -->|cola FIFO real| J
F --> J
G --> J
J --> K[⚔️ Invocar → Atacar → Turno rival]
K -->|se repite| K
K -->|HP a 0 o sin cartas| L[🏆 Victoria / 💀 Derrota]
Nada de criaturas inventadas: cada carta es una especie real (nombre científico incluido), con estadísticas derivadas de su biología y una fotografía real obtenida en vivo desde Wikipedia, Wikimedia Commons, iNaturalist y GBIF (con verificación taxonómica automática — nunca se muestra la foto equivocada por un nombre científico mal escrito).
| Estadística | Qué representa |
|---|---|
| ❤️ HP | Puntos de vida |
| ⚔️ ATK | Ataque |
| 🛡️ DEF | Defensa |
| ⚡ SPD | Velocidad |
| 👁️ INST | Instinto (precisión / iniciativa) |
| 🧬 ADP | Adaptabilidad |
Todo reptil respeta el mismo BST (Base Stat Total) = 360, así que ninguno es "objetivamente mejor" — cada uno es una combinación distinta de fortalezas y debilidades, auditada para que ningún arquetipo (tanque, glass cannon, velocista) domine el ranking estructuralmente.
8 afinidades organizadas en un ciclo cerrado, como piedra-papel-tijera pero con más matices:
flowchart LR
Termico(🔥 Térmico) --> Acuatico(🌊 Acuático)
Acuatico --> Venenoso(☠️ Venenoso)
Venenoso --> Acorazado(🛡️ Acorazado)
Acorazado --> Agil(⚡ Ágil)
Agil --> Camuflaje(🌿 Camuflaje)
Camuflaje --> Sensorial(👁️ Sensorial)
Sensorial --> Constrictor(🐍 Constrictor)
Constrictor --> Termico
Cada afinidad, siguiendo la flecha:
Ese cierre matemático (2 ventajas / 2 desventajas / 4 neutrales, siempre) se audita automáticamente en /afinidades — si algún cambio de diseño rompe el ciclo, la herramienta lo marca al instante con 🚨.
Todas las fórmulas viven en un único lugar (lib/game-engine/), parametrizadas — nunca hay un número mágico escondido en un componente:
Daño = Potencia × (ATK + offset) / (DEF + offset) × MultiplicadorAfinidad × STAB ÷ divisor
/matchups.Este es el mismo código que corre en:
/simulador), para un game designer probando cambios.| Modo | Cómo funciona |
|---|---|
| 🤝 Crear con amigo | Armás tu mazo, generás un código de sala único y se lo compartís a tu rival. Pantalla de espera con el código, copiar-al-portapapeles y cancelar. |
| 🔑 Unirse con código | Tu rival ingresa el código, arma su mazo, y ambos entran a la batalla — sin importar en qué red o dispositivo esté cada uno. |
| 🎲 Partida aleatoria | Cola de emparejamiento real (no un timer simulado): el sistema te empareja con el primer rival disponible en cuanto ambos estén buscando. Si nadie aparece, te avisa. |
| 🤖 Contra la IA | La IA arma su propio mazo y razona de verdad: al invocar, elige la carta con mejor ventaja de afinidad contra tu reptil activo; al atacar, prioriza la habilidad de mayor daño esperado, o una jugada defensiva si su HP está bajo. |
| 📱 Este dispositivo | El clásico "pasa y juega": dos personas, un mismo celular o computadora, sin necesidad de conexión. |
Todos los modos comparten el mismo tablero, las mismas cartas y el mismo motor de daño — la única diferencia es quién ejecuta las reglas (el navegador en modo local, el servidor en modo online).
La parte más ambiciosa del proyecto: dos jugadores en dispositivos físicos distintos, en redes distintas, viendo la misma partida actualizarse en vivo — sin que ninguno tenga que recargar la página.
sequenceDiagram
participant A as 📱 Jugador A
participant S as ☁️ Servidor (Route Handler)
participant DB as 🗄️ Supabase (Postgres + Realtime)
participant B as 📱 Jugador B
A->>S: POST /api/game/rooms (crea sala + mazo)
S->>DB: guarda sala en estado WAITING
S-->>A: código de sala + token de vista privado
B->>S: POST /api/game/rooms/{codigo}/join (arma mazo)
S->>DB: crea la partida (motor puro), estado → IN_PROGRESS
S->>DB: publica el estado (redactado) en el canal privado de cada jugador
DB-->>A: broadcast en tiempo real
DB-->>B: broadcast en tiempo real
Note over A,B: ambos ven "¡Oponente encontrado!" al instante
A->>S: POST /action (atacar)
S->>S: valida turno + ejecuta el motor de combate
S->>DB: persiste el nuevo estado, publica en ambos canales
DB-->>B: HP del rival baja en tiempo real, sin recargar
¿Por qué no un servidor de sockets propio? El proyecto vive en Vercel (funciones serverless, sin proceso Node persistente). En vez de inventar infraestructura nueva, se reutiliza Supabase Realtime (ya incluido en la librería cliente que el proyecto ya usaba) publicando eventos desde el servidor — cero dependencias nuevas, cero servidores adicionales que mantener.
Un juego de cartas real necesita niebla de guerra: nunca deberías poder ver el mazo sin jugar de tu rival, ni siquiera espiando el tráfico de red del navegador.
"?" — mismo largo, cero información.Un botón discreto ADMIN en la portada abre un login (misma sesión firmada por HMAC que protege todo /admin) para:
Todo cambio persiste en Postgres al instante y el resto de la app (roster, ranking, dashboard, mazos disponibles) se actualiza sin necesitar un redeploy.
Además del juego en sí, el proyecto incluye un panel completo de game design tooling:
REVISAR / RIESGO_ALTO).(landing) (portada + /jugar/*, sin sidebar) y (tool) (dashboard, roster, admin y el resto de las herramientas, con sidebar) — mismas URLs de siempre, cero rutas rotas.lib/card-game/engine.ts): un reducer (state, acción) => state sin efectos secundarios, que corre tanto en el cliente (modo local/IA) como en el servidor (modo online) sin cambiar una sola línea — eso es lo que le da autoridad al servidor sin duplicar lógica de juego.lib/card-game/ai.ts): sin aleatoriedad disfrazada de inteligencia — reutiliza el mismo cálculo de daño y de afinidades que ve un jugador humano en pantalla.src/
app/
(landing)/ # Portada animada + todo /jugar (sin sidebar)
page.tsx # Hero animado, botón JUGAR
layout.tsx # Header discreto + modal de login admin
jugar/
page.tsx # "Bienvenido a la Arena" — selector de modo
crear/, unirse/, aleatorio/, ia/, local/ # un flujo por modalidad
sala/[codigo]/ # Tablero de batalla online en vivo
mesa/ # Tablero de batalla local / vs IA
(tool)/ # Todas las herramientas de diseño (con sidebar)
dashboard/, roster/, comparador/, simulador/, matchups/, ranking/,
afinidades/, habilidades/, auditoria/, nuevo-personaje/, familias/,
configuracion/, admin/, reptiles/[id]/
api/
admin/ # Login/logout/me + CRUD (service_role)
game/ # rooms, join, action, cancel, queue — autoridad del servidor
components/
cards/ # GameCard (con degradación visual por HP), Board, TurnBanner,
# AttackAnimation, Countdown, ConnectionBanner, DeckBuilder
admin/ # AdminGate, AdminLoginModal, ReptileEditorForm
layout/ # Sidebar, AppShell, RosterProvider, GlobalSearch (Ctrl+K)
lib/
game-engine/ # ÚNICA fuente de verdad de toda fórmula de balance
card-game/ # engine.ts (reducer puro) + ai.ts (heurística de la IA)
supabase/ # client/server/admin, queries, game-queries, realtime
store/ # game-store (partida local), roster-store, config-store
hooks/ # useRoster, useEngineData, useGameRoom, useAdminAuth
data/ # Roster y habilidades semilla (para scripts/seed.ts y tests)
supabase/migrations/ # Esquema SQL versionado (roster, salas online, RLS, grants)
scripts/ # seed.ts, check-taxonomy.ts, fix-grants.sql
git clone TU_REPOSITORIO
cd reptiles-rpg
npm install
cp .env.example .env.local # completá las variables (ver abajo)
npm run dev
Abrí http://localhost:3000 — te recibe la portada animada.
supabase/migrations/*.sql (esquema base, salas de juego, multijugador online, y el ajuste de nulabilidad de estado)..env.local las claves de Project Settings → API Keys.npx tsx scripts/seed.ts
/admin en ADMIN_PASSWORD.Si ves
permission denied for table ..., falta elGRANTbase del rol (RLS solo no alcanza) — corréscripts/fix-grants.sqlen el SQL Editor.
| Variable | Para qué |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | URL del proyecto Supabase |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Clave pública (navegador) |
SUPABASE_SECRET_KEY | Clave service_role — solo servidor, nunca en el navegador. Necesaria para /admin, el seed y toda la autoridad del servidor en /api/game/* |
ADMIN_PASSWORD | Contraseña del panel de administración |
NEXT_PUBLIC_WIKIPEDIA_API_URL / ..._WIKIMEDIA_... / ..._INATURALIST_... / ..._GBIF_... | Endpoints públicos de imágenes y taxonomía — configurables sin tocar código |
npm run test
33 tests (Vitest) que validan, sin necesitar red ni Supabase:
npm run build está verificado (TypeScript estricto sin errores, ESLint sin errores). Conectá el repositorio en Vercel y agregá las mismas variables de .env.local en la configuración del proyecto — sin ellas el sitio no puede leer el roster ni levantar una sala de juego.
Next.js 16 (App Router, Turbopack) · React 19 · TypeScript · Tailwind CSS v4 · Supabase (Postgres + Realtime) · Zustand · Framer Motion · Recharts · TanStack Table · React Hook Form + Zod · Lucide React · cmdk (Ctrl+K) · Vitest.
Hecho con 🦎, TypeScript y demasiado café.