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,即可验证所有权并自行管理介绍。
一分钟完成验证🪖 Jogo de celular em 3D no navegador: esquadrão que atira sozinho, portais de conta (+8, ×2, ÷2), barris, chefões e uma loja que calibra a dificuldade. Arte e som 100% gerados por código.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Um esquadrão, uma pista e muita gente querendo te parar. Corra, atire sozinho, escolha o portal certo e segure a horda até o chefão. Jogo de celular em 3D, direto no navegador. ▶️ Jogar agora: squad-x-web-inky.vercel.app Abra no celular, em pé. Dá para instalar como app e jogar sem internet. Gravado no jogo: um bot jogando a fase 12 (deserto). Repare no +22 azul à esquerda e no -16 vermelho com cadeado à direita.查看完整 README ↗
Sabe aquele anúncio de celular em que um soldadinho corre por uma ponte, passa por um portal ×4 e vira um exército? Aqui ele é um jogo de verdade, e com as decisões que o anúncio nunca mostra.
Você arrasta o dedo para mover o esquadrão. Ele atira sozinho. O resto é escolher: qual portal tomar, qual barril abrir primeiro, para onde desviar quando o avião marca a pista com vermelho, e quanto do dinheiro gastar na loja antes da próxima fase.
Tudo é original: cada soldado, monstro, arma e som sai de código. Nenhum modelo ou arquivo de áudio foi copiado.
+N e ×N ajudam, -N e ÷N machucam. Os vermelhos com cadeado não dá para consertar a tiros; só existe um tipo de vermelho "bombeável", e só vale a pena com poder de fogo de sobra.Visto de costas, que é como você o enxerga no jogo: capacete grande com aba, colete com placas, mochila com rolo de dormir, pá e cantil. Conforme o grupo cresce, os soldados diminuem e se apertam para o bloco não cobrir a pista; até 180 aparecem na tela, e o número em cima do grupo mostra o total real.
Cada tipo tem rosto, silhueta e jeito de correr próprios, e só entra numa fase quando o esquadrão esperado aguenta enfrentá-lo.
| Inimigo | Chega no mundo | Vida | Como é |
|---|---|---|---|
| Zumbi | 1 | 6 | Corre em bando, camisa rasgada |
| Velocista | 2 | 4 | O dobro da velocidade do zumbi |
| Brutamonte | 1 | 40 | Porrete e ombreiras de espinhos; leva 4 soldados ao encostar |
| Policial de choque | 2 | 34 | Escudo: soldados rendem 45%. Tanque e helicóptero ignoram |
| Homem-bomba | 3 | 9 | Dinamite no peito; morto de longe, leva os vizinhos junto |
| Atirador | 4 | 14 | Para a 16 unidades, atira a cada 1,3 s e recua se você chega perto |
Um por mundo, nas fases 5 e 10. O esquadrão para a 14 unidades deles e só segue quando morrem. Cada um ataca do seu jeito, e tudo o que ele lança é avisado antes, com um jeito de escapar:
| Chefão | Mundo | Ataque | Como enfrentar | Lacaios |
|---|---|---|---|---|
| General | Ponte | Mísseis na sua faixa, um de cada vez, com a mira marcada no chão (um atrás do outro quando furioso) | Derrube no ar com as colunas embaixo dele, ou saia da mira | Zumbis |
| Senhor da Guerra | Deserto | Uma fileira de barris explosivos rolando, com uma faixa livre | Vá para a faixa livre ou abra caminho a tiros. Os barris também protegem o chefão | Velocistas |
| Mecha | Cidade | Escudo de energia com uma brecha que muda de lugar, e laser na brecha | Atire pela brecha (a faixa verde) e saia dela quando o laser marcar | Policiais de choque |
| Yeti | Neve | Sopro de gelo e, logo em seguida, a pancada | Saia do azul: quem congela para de atirar e o esquadrão anda devagar | Brutamontes |
| Demônio | Vulcão | Meteoros em todos os lugares menos um, e o chão pega fogo onde caem | Ache o lugar livre e fique fora das chamas | Homens-bomba |
Abaixo da metade da vida o chefão fica furioso (aura vermelha, ataques mais rápidos), e os lacaios vêm em ondas cada vez maiores: enrolar é perder. A vida dele é medida em segundos de tiro do esquadrão que um jogador típico leva até ali (12 s, ou 18 s no chefão que fecha o mundo), então nenhum cai num instante e nenhum dura minutos. Na prática, a luta leva de uns 10 a uns 60 segundos.
Quando o chefão entra em vista, a barra de progresso vira a barra de vida dele, com o nome, o número e a marca da fúria. A parte vermelha cai na hora e um rastro claro vai atrás, então dá para ver quanto cada rajada tirou. Ao acordar, ele avisa o que faz.
Uma arma melhor troca a de todos os soldados. Os veículos correm ao lado do esquadrão, até quatro, cada um com um soldado dentro, e atiram na própria faixa mesmo que só reste um soldado.
| Perigo | Como evitar | Custo se pegar |
|---|---|---|
| Espinhos | Mudar de faixa (não dá para atirar) | 40% dos soldados nas colunas sobre eles |
| Mina | Atirar de longe (14 de vida) ou desviar | 60% dos soldados num raio de 1,7 |
| Bombardeiro | Ficar no corredor sem vermelho; 1,6 s de aviso | 30% dos soldados dentro de cada bomba, em 2 ou 3 passadas |
Esquadrão pequeno desvia melhor; esquadrão grande aguenta mais. Cada colisão tira uma fração dos soldados das colunas atingidas, não de todos.
Cada mundo tem dez fases, com um chefão na 5 e na 10. As fases alternam entre Portais, Barris e Misto, e cada uma tem uma característica própria: Enxame, Elite, Emboscada, Escassez, Correria ou Armadilhas. O aviso aparece ao começar. Cada fase leva de uns 45 a 75 segundos de pista.
O jogo é feito para quem insiste e evolui: passa a fase 1 e a 2, trava na 3 até comprar algo, e daí em diante cada fase costuma pedir algumas tentativas.
bun run stress mostra fase a fase.A tela sempre diz o que você tem (soldados, arma, veículos, melhorias), o que acabou de acontecer (portal, barril, armadilha, bomba) e, na luta, quanta vida o chefão ainda tem. O relatório da fase mostra de onde veio cada moeda e o que derrubou o esquadrão.
| Camada | O que usa |
|---|---|
| Linguagem | TypeScript strict e ESM, num monorepo de Bun workspaces |
| Regras do jogo | packages/engine: TypeScript puro e determinístico, sem DOM |
| Cliente | React 19 + Vite 7 para as telas e o HUD; a partida é desenhada em Three.js |
| Arte | Montada por código a partir de formas simples, com sombreamento "toon" e contorno preto |
| Som | Sintetizado em tempo real com Web Audio, sem nenhum arquivo de áudio: efeitos em camadas com eco de sala, e uma música para o menu, outra para a fase e outra para o chefão |
| Instalação | PWA: manifesto e service worker (vite-plugin-pwa); depois da primeira visita, joga sem internet |
| Fases | Geradas por semente e calibradas por simulação (bun run calibrate) |
| Testes | bun test: 108 testes, incluindo cada chefão, o equilíbrio das fases com e sem loja e a campanha inteira jogada por bots |
flowchart LR
subgraph engine["packages/engine (puro)"]
gen["gerador de fases<br/>por semente"]
cal["calibração<br/>com bots"]
step["step: um tick a 30 Hz"]
end
tab[("pressures.ts<br/>(tabela gerada)")]
subgraph web["apps/web"]
ui["React: menu, loja, HUD"]
scene["Three.js: a pista"]
fx["som, efeitos e avisos"]
end
cal -- "bun run calibrate" --> tab
tab --> gen
gen --> step
step -- "estado" --> scene
step -- "diferença entre dois estados" --> fx
ui --> step
Algumas escolhas que fazem diferença:
Math.random() nas regras: o acaso vem de um gerador com semente, então todo bug vira um teste que se repete.InstancedMesh, com as peças de mesma cor fundidas e um contorno por trás.Detalhes em docs/ARCHITECTURE.md (como funciona), docs/DECISIONS.md (por quê) e docs/ROADMAP.md (o que vem por aí). A folha de referência visual de todos os personagens e telas está em docs/design-system.html: baixe e abra no navegador.
| Ação | Teclado | Celular |
|---|---|---|
| Mover o esquadrão | ← → ou A D | arrastar o dedo |
| Som ligado/desligado | botão 🔊 | botão 🔊 |
| Sair da fase | botão ✕ | botão ✕ |
O esquadrão atira sozinho, e depois de arrastar ele termina o deslize até onde você soltou.
Precisa de Bun e do Node do .nvmrc.
bun install
bun run dev # Vite em http://localhost:5183
No celular: com o computador e o celular na mesma rede Wi-Fi, abra http://<IP do computador>:5183 no navegador do celular. O IP sai de ipconfig getifaddr en0 (no Mac). localhost no celular é o próprio celular. O Vite já escuta na rede.
Atalhos na URL para testar:
?bot=1: o bot da engine joga a fase sozinho (aparece o selo 🤖 BOT);?galeria=1: a galeria dos modelos (soldado, inimigos, chefões, armas, veículos, perigos); arraste para girar;?chefao=yeti: a arena dos chefões, uma luta curta direto com o chefão (general, warlord, mech, yeti ou demon); a barra de baixo troca de chefão e alterna entre você e o bot.| Comando | O que faz |
|---|---|
bun run test | Testes da engine, incluindo o equilíbrio das fases |
bun run typecheck | Checagem de tipos da engine e do cliente |
bun run build | Build de produção do cliente |
bun run calibrate | Joga as 50 fases com bots e regrava a tabela de dificuldade |
bun run stress | Teste de estresse: bots jogam a campanha inteira comprando na loja e repetindo fases |
bun run icons | Redesenha os ícones do app (aba do navegador e tela inicial) |
Mexeu em regra, gerador, bot ou loja? Rode bun run calibrate, depois bun run test e bun run stress.
O jogo está no ar em squad-x-web-inky.vercel.app. É um PWA: no Android o Chrome oferece "Instalar app"; no iPhone é Compartilhar → "Adicionar à Tela de Início". Depois da primeira visita ele abre e joga sem internet, e uma versão nova baixa em segundo plano e aparece na abertura seguinte (para ver um deploy novo, abra duas vezes). O progresso fica só no aparelho. Quando uma versão muda o jogo a ponto de o progresso antigo não fazer sentido (como a dos chefões com ataques próprios), todo mundo recomeça da fase 1, e o menu avisa.
Instalar e jogar offline exigem HTTPS, então não valem pelo http://<IP>:5183 do desenvolvimento: o service worker só existe no build de produção. A publicação é na Vercel, no free tier e sem servidor: o vercel.json diz como montar o cliente, e cada push no master gera uma versão nova.
packages/engine: regras, gerador de fases, bots, loja e calibraçãoapps/web: cliente em React + Three.js (cena, personagens, cenários, interface, som)tools: os scripts de calibração e dos íconesdocs: arquitetura, decisões, roadmap e a folha de referência visualVai trabalhar no código com um agente de IA? As instruções estão em CLAUDE.md (o AGENTS.md aponta para ele).
O código está à mostra, mas não é open source. A licença é a PolyForm Strict 1.0.0, com uma permissão a mais para pull requests.
Os termos completos estão em LICENSE. Quer usar para outra coisa? Abra uma issue e pergunte.