BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
Play a plant‑defense roguelite where you plant seeds, combine elements and survive waves
AI summary · website content
GamesTypeScript · PythonGitHub @JoaoMagalhaes321OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
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
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Tower defense 2.5D de plantas contra zumbis, com elementos (natureza, água, elétrico, fogo…),
sinergias entre plantas, mutações roguelite, clima dinâmico e trilha sonora original.
O jogo se chamava "PvZ: Evolution" e o repositório, pvz-evolution; em outubro de 2026 tudo passou a se chamar cerca-viva
(site, repositório e id do app Android com.cercaviva.jogo). Links antigos do GitHub redirecionam; o endereço antigo do site não.
Roda no navegador e no Android (app Capacitor).
public/convite/.main. Como não vem da Play Store, o Android pede para
permitir instalar apps dessa origem. O APK é assinado com uma chave fixa e pública
(android/app/cerca-viva-debug.keystore), para cada versão nova instalar por cima da anterior; para
publicar na Play Store será preciso uma chave privada.Requer Node.js 20.
npm install
npm run dev # abre em http://localhost:5180 (também acessível pela rede local)
| Comando | O que faz |
|---|---|
npm run dev | Servidor de desenvolvimento com recarga automática (porta 5180) |
npm run build | Confere os tipos (tsc) e gera o site em dist/ |
npm run preview | Serve o dist/ gerado, para testar o build final |
npm test | Roda os testes automáticos (Vitest) de tests/: progresso salvo e catálogo de fases |
npm run mobile:sync | Build + copia o site para o projeto Android (npx cap sync android) |
npm run mobile:apk | Gera o APK de debug no Windows (gerar-apk.ps1, precisa do Android SDK) |
npm run mobile:patch | Gera um patch .zip do site em patches/ (gerar-patch.ps1) |
Os botões 💀 Chefe (invoca a Colheitadeira Z na hora) e 🌦️ (troca o clima) só aparecem no modo dev, porque quebram a progressão de quem está jogando:
npm run dev, sempre;?dev=1 no fim (ex.: .../index.html?dev=1).A regra fica em src/modo-dev.ts; para mostrar outro elemento só no modo dev, dê a ele a classe
so-dev e o atributo hidden no index.html.
O workflow .github/workflows/ci.yml roda npm ci, npm run build e npm test em todo push de
branch claude/** e em todo pull request para a main. Ele não publica nada: só mostra ✅ ou ❌ na
branch e no pull request, para você saber antes do merge se o build e os testes passam.
main dispara o workflow .github/workflows/deploy.yml, que:
Cerca-Viva-Android-APK na execução do Actions.capacitor.config.json aponta server.url
para o site do GitHub Pages. Por isso, depois de instalado uma vez, o app recebe toda versão nova
publicada na main, sem reinstalar.public/sw.js, registrado por src/updater.ts) guarda o jogo em cache para abrir
rápido e funcionar sem internet:
index.html) vem da rede primeiro, então a versão nova aparece já na primeira abertura;
sem internet, abre a cópia guardada;assets/ (com hash no nome) vêm direto do cache; sprites e ícones vêm do cache e
se atualizam em segundo plano;npm run build o dist/sw.js ganha uma versão nova (impressão digital do build, feita pelo
plugin do vite.config.ts com src/sw-versao.ts). O navegador instala o service worker novo, a
página recarrega uma vez sozinha e os caches antigos são apagados. O progresso salvo
(localStorage) não é tocado. No npm run dev a versão fica __VERSAO_DO_BUILD__.
publicar-atualizacao.ps1faz build, commit de tudo e push direto namain, ou seja, publica na hora. Use só quando quiser mandar a versão para o celular.
| Arquivo | Conteúdo |
|---|---|
index.html | HUD, menu inicial, modais (deck, almanaque, mutações, recompensa de planta, seleção de fases, fim de jogo) |
src/main.ts | Liga a interface ao motor: menus, deck, botões, loop do jogo |
src/engine.ts | Motor do jogo: grade, plantas, zumbis, projéteis, clima, poderes, sinergias |
src/renderer.ts | Desenho 2.5D dos personagens, animações e partículas |
src/audio.ts | Efeitos e trilha sonora sintetizados com Web Audio |
src/types.ts | Tipos e catálogos: plantas, biomas, sinergias, mutações |
src/levels.ts | Fases do modo aventura (Mundo 1: 1-1 a 1-10; Mundos 2 a 4: cinco fases cada) e ondas |
src/musgo.ts | Musgo-Esponja, recompensa do Mundo 2 (fase 2-5): números da planta num lugar só |
src/mangue-vermelho.ts | Mangue-Vermelho, recompensa do Mundo 4 (fase 4-5): números da planta num lugar só |
src/progresso-sanitizar.ts | Confere o progresso carregado contra os catálogos (fase que não existe, planta desconhecida, repetida) |
src/progression.ts | Progresso do jogador salvo no localStorage (chave pvz_player_progress_v1) |
src/updater.ts | Registro do service worker e recarga quando chega versão nova |
src/sw-versao.ts | Versão do service worker gerada no build |
android/ | Projeto Android gerado pelo Capacitor |
src/levels.ts (LEVEL_CATALOG). Vencer a última fase de um
mundo (fechaMundo) mostra "Mundo N concluído"; o Mundo 2 dá o Musgo-Esponja (src/musgo.ts)
e o Mundo 4 dá o Mangue-Vermelho (src/mangue-vermelho.ts).src/types.ts.src/progression.ts (DEFAULT_PLAYER_PROGRESS).src/progresso-sanitizar.ts. Se o progresso salvo tiver algo
estranho, o jogo corrige campo por campo e guarda o texto original em
pvz_player_progress_v1_antes_da_correcao (para voltar, copie esse valor de volta para
pvz_player_progress_v1 nas ferramentas do navegador).Depois de mexer nessas regras, rode npm test: os testes de tests/levels.test.ts conferem que as fases
seguem em sequência, que toda planta liberada existe, que nenhuma é liberada duas vezes e que os zumbis
e as linhas das ondas são válidos. Zumbi novo no motor (ZombieVariant em src/engine.ts) precisa
entrar também em KNOWN_ZOMBIES no teste.
Um agente agendado trabalha no projeto em branches claude/… (nunca na main). O quadro de status,
as regras dele e o registro de decisões ficam em docs/status/ na branch claude/quadro.