# ⚓ Captain Cannonball

<div align="center">

![Python](https://img.shields.io/badge/Python-3.12-3776AB?style=for-the-badge&logo=python&logoColor=white)
![Pygame](https://img.shields.io/badge/Pygame-2.6.1-1f8a70?style=for-the-badge)
![PyTMX](https://img.shields.io/badge/PyTMX-3.32-d4a017?style=for-the-badge)
![Tiled](https://img.shields.io/badge/Tiled-Mapas%20TMX-5c7cfa?style=for-the-badge)

**Uma aventura pirata 2D feita em Python, Pygame, Tiled e PyTMX.**

🌊 [Site oficial do jogo](https://insper-classroom.github.io/pygame-site-turquesa-lucas-pedro/) · 🕹️ Plataforma 2D · 🏴‍☠️ Pixel art · ⏱️ Ranking por tempo

<img src="img/tela_inicio.png" alt="Tela inicial de Captain Cannonball" width="720">

</div>

---

## 🏴‍☠️ Sobre o jogo

**Captain Cannonball** coloca o jogador no papel do destemido **Capitão Nilo**, preso em uma ilha cheia de armadilhas, inimigos e rotas perigosas. A missão é simples de entender e difícil de dominar: atravessar três fases, sobreviver aos perigos tropicais e alcançar a liberdade no menor tempo possível.

O jogo combina movimentação de plataforma, combate com espada, fases construídas no **Tiled**, telas temáticas, sistema de vidas, transições de fases, cronômetro e ranking persistente. Tudo isso com uma identidade visual inspirada em mapas náuticos, ilhas tropicais e na era dourada dos jogos 16 bits.

## 🧭 Jornada

| Fase | Nome | Desafio |
| --- | --- | --- |
| 01 | 🌴 **Costas Tropicais** | Avanço por palmeiras, passagens secretas e obstáculos naturais. |
| 02 | ⚙️ **O Poço de Aço** | Subida vertical com plataformas móveis e ambiente mecânico hostil. |
| 03 | ⛵ **Porto da Liberdade** | Corrida final rumo ao navio para escapar da ilha. |

Antes de cada fase, o jogo apresenta uma tela de introdução própria. Ao concluir a última etapa, o jogador registra seu nome no ranking e entra para o diário de bordo dos melhores tempos.

## ✨ Principais recursos

- 🎮 **Plataforma 2D completa**, com pulo, wall jump, colisões e movimentação fluida.
- ⚔️ **Combate corpo a corpo**, usando espada contra inimigos e ameaças.
- ☠️ **Armadilhas e perigos**, incluindo espinhos, serras, projéteis e água fatal.
- 🪙 **Colecionáveis**, como moedas e itens de vida.
- 🧱 **Mapas feitos no Tiled**, carregados dinamicamente com PyTMX.
- 🖼️ **Telas temáticas**, incluindo início, instruções, introdução de fase, game over e vitória.
- ⏱️ **Cronômetro em tempo real**, exibido durante a partida.
- 🏆 **Ranking persistente**, salvo em arquivo local com nome e tempo final.
- 🎵 **Trilha sonora e efeitos**, tocando desde a tela inicial até o fim da aventura.

## 🕹️ Controles

| Tecla | Ação |
| --- | --- |
| `←` / `→` | Mover o Capitão Nilo |
| `Espaço` | Pular, iniciar o jogo ou começar a fase |
| `X` | Atacar com espada |
| `↓` | Atravessar plataformas semissólidas |
| `H` | Abrir a tela de instruções |
| `R` | Abrir o ranking |
| `I` | Voltar para a tela inicial |
| `V` | Reiniciar nas telas finais ou ranking |
| `Esc` | Sair do jogo |
| `Enter` | Salvar nome no ranking após vencer |
| `Backspace` | Apagar letra ao digitar o nome |

## 🚢 Como zarpar

### 1. Clone o repositório

```bash
git clone https://github.com/insper-classroom/pygame-jogo-turquesa-lucas-pedro.git
cd pygame-jogo-turquesa-lucas-pedro
```

### 2. Crie e ative um ambiente virtual

No Windows:

```bash
python -m venv .venv
.venv\Scripts\activate
```

No Linux/macOS:

```bash
python3 -m venv .venv
source .venv/bin/activate
```

### 3. Instale as dependências

```bash
pip install -r requirements.txt
```

### 4. Execute o jogo

Execute a partir da raiz do repositório:

```bash
python code_complete/main.py
```

Em alguns sistemas, pode ser necessário usar:

```bash
python3 code_complete/main.py
```

## 🗂️ Estrutura do repositório

```text
pygame-jogo-turquesa-lucas-pedro/
├── audio/           # Trilha sonora e efeitos sonoros
├── code_complete/   # Código principal do jogo
├── data/            # Fases, tilesets, overworld e ranking
├── graphics/        # Sprites, tiles, UI, inimigos e objetos
├── img/             # Telas do jogo e introduções das fases
├── requirements.txt # Dependências do projeto
└── README.md        # Este diário de bordo
```

## 🧩 Arquitetura

O projeto é organizado em módulos que separam responsabilidades importantes do jogo:

| Arquivo | Responsabilidade |
| --- | --- |
| `code_complete/main.py` | Loop principal, estados de tela, ranking, música e transição entre fases. |
| `code_complete/level.py` | Construção das fases, colisões, inimigos, objetos, água e bandeira final. |
| `code_complete/player.py` | Movimento, física, ataque, animações, dano e interação do jogador. |
| `code_complete/sprites.py` | Sprites gerais, plataformas móveis, itens, armadilhas e entidades animadas. |
| `code_complete/groups.py` | Câmera, renderização por camadas e desenho do cenário. |
| `code_complete/ui.py` | Interface de vida, moedas e elementos visuais do HUD. |
| `code_complete/data.py` | Estado persistente da partida, vida, moedas e progresso. |
| `code_complete/support.py` | Carregamento de imagens, pastas de sprites e assets. |
| `data/levels/` | Mapas `.tmx` criados no Tiled. |
| `data/ranking.json` | Ranking local com os melhores tempos. |

## 🏆 Ranking

O tempo começa quando a aventura é iniciada e acompanha o jogador durante as três fases. Ao vencer, o jogador informa seu nome, e o resultado é salvo em:

```text
data/ranking.json
```

Quanto menor o tempo, melhor a posição no ranking. A tela pode ser aberta com `R` a partir das telas que possuem essa opção.

## 🌐 Site do projeto

O site oficial apresenta a identidade visual do jogo, descrição das fases, galeria, equipe, log de desenvolvimento, avaliação CRAP e instruções de download:

👉 **https://insper-classroom.github.io/pygame-site-turquesa-lucas-pedro/**

## 👨‍💻 Tripulação

Projeto desenvolvido no **1º semestre de Ciência da Computação do Insper**.

| Desenvolvedor | Contribuição |
| --- | --- |
| **Lucas Ibanez** | Desenvolvimento do site e do jogo, experiência visual, estrutura da apresentação e implementação do projeto. |
| **Pedro Zanin** | Desenvolvimento do jogo, lógica, mecânicas, fases e construção da experiência jogável. |

## 📜 Créditos

Este projeto foi inspirado na base **Super Pirate World**, de **Christian Koch / Clear Code**, publicada sob **Creative Commons 0**. A versão final foi adaptada, expandida e polida para o projeto **Captain Cannonball**, com novas telas, fluxo de fases, ranking, cronômetro, ajustes de jogabilidade e identidade própria.

---

<div align="center">

**⚓ Captain Cannonball**<br>
Pixel art, sal no rosto e um mapa rasgado no bolso.

</div>
