Um tower defense no estilo Plants vs. Zombies, só que com patos.
Choque os ovos, junte energia e não deixe os fantasmas atravessarem o gramado.
- Escolha seus patos antes da fase e monte a sua barra de patos.
- Clique num pato da barra e depois num buraco do gramado para colocá-lo. Cada pato custa energia.
- O pato nasce como um ovo, que balança até chocar. Só depois disso ele começa a agir.
- Clique nas energias que o Pato Amarelo produz para ganhar +25 de energia. Você começa a fase com 50.
- Os fantasmas chegam em ondas pelas 5 faixas. Se um deles chegar ao fim do gramado, é game over.
- Derrote todos os inimigos para liberar a próxima fase.
Os patos de ataque só atiram quando há um inimigo na frente deles, na mesma faixa. Cada tiro tira 25 de vida, e os inimigos têm 100.
| Inimigo | Comportamento | |
|---|---|---|
| Fantasma | Flutua da direita para a esquerda e ataca o pato que estiver no caminho até destruí-lo. |
- 🗺️ 6 fases, cada uma com as suas ondas definidas em JSON (
waveJson/). - 🔓 Progressão: as fases são liberadas conforme você avança.
- 💾 Saves em slots, guardados em
user://saves/. - ⚙️ Configurações: resolução (1920×1080, 1600×900 e 1280×720), tela cheia e volume. Ficam salvas em
user://config.cfg. - ⏸️ Pausa, tela de game over e transições com fade.
- Instale o Godot 4.3 ou mais novo.
- Clone o repositório:
git clone https://github.com/LeandroCustodio2002/tower-defense.git
- No Godot, clique em Import, selecione o
project.godote abra o projeto. - Aperte F5 para jogar. A cena inicial é o menu principal (
scenes/ui/MainMenu.tscn).
Cada fase é um JSON em waveJson/:
{
"levelId": 0,
"numEnemys": 7,
"waves": [
{ "enemy": 0, "quant": 1, "timeBefore": 10 },
{ "enemy": 0, "quant": 2, "timeBefore": 10 },
{ "enemy": 0, "quant": 4, "timeBefore": 30 }
]
}| Campo | Significado |
|---|---|
levelId |
Número da fase. Vencer libera a levelId + 1. |
numEnemys |
Total de inimigos da fase. Ao chegar a 0, você vence. |
waves[].quant |
Quantos inimigos a onda tem. Eles nascem em faixas aleatórias, um a cada 1,5 s. |
waves[].timeBefore |
Segundos de espera antes da onda. |
waves[].enemy |
Tipo do inimigo (por enquanto só existe o 0). |
Depois, adicione a fase na tela de seleção (scenes/worlds/LevelSelection.tscn) com o levelId e o level_json_path.
Os patos são recursos do tipo Duck (resources/duck.gd). Para criar um novo, duplique um dos .tres em resources/ e ajuste:
| Campo | Para quê |
|---|---|
bullet |
Cena do projétil (ou da energia, se não for de ataque) |
bulletTime |
Intervalo entre os disparos, em segundos |
cost |
Custo em energia |
isAtkDuck |
true atira só quando há inimigo na faixa; false produz sempre |
life |
Vida do pato |
spriteContent |
Sprite |
├── resources/ # Patos (Duck .tres) e o script do recurso
├── scenes/
│ ├── ducks/ # Cenas dos patos e do ovo
│ ├── enemys/ # Fantasma
│ ├── Projectiles/ # Tiros: padrão, gelo, fogo e gosma
│ ├── collectibles/ # Energia
│ ├── level/ # Faixas e buracos do gramado
│ ├── ui/ # Menus, barra de patos, pausa, saves, configurações
│ └── worlds/ # Seleção de fases
├── scripts/ # Scripts GDScript (Global e SaveManager são autoloads)
├── sprites/ # Patos, ovos, inimigos, projéteis e UI
├── songs/ # Música e efeitos
└── waveJson/ # Ondas de cada fase
Feito com 🦆 por Leandro Custódio