Jogo de sobrevivência estilo bullet hell desenvolvido em Python com Pygame-CE, com foco em combate rápido, progressão por upgrades, múltiplos personagens, sistema de pactos e pipeline de performance baseado em indexação espacial (NumPy + Numba JIT + Cython opcional).
English version: README.en.md
- Visão geral
- Personagens
- Inimigos e Chefes
- Sistemas de jogo
- Interface e UI medieval
- Arquitetura do projeto
- Requisitos
- Instalação e execução
- Performance e build
- Distribuição com PyInstaller
- Controles
- Configurações, save e persistência
- Resolução e compatibilidade
- Debug e benchmark de performance
- Estrutura de pastas
- Roadmap
- Contribuição
- Licença
UnderWorld Hero é um survivor roguelike onde o jogador enfrenta ondas crescentes de inimigos, escolhe upgrades a cada nível e tenta sobreviver o maior tempo possível. A cada run é possível escolher personagem, dificuldade, pacto e bioma, gerando combinações distintas de desafio e estilo.
Destaques gerais:
- Combate em tempo real com alto volume de inimigos em tela.
- Progressão por nível com seleção de upgrades e evoluções sinérgicas.
- 6 personagens jogáveis com estilos e ultimates próprios.
- 4 níveis de dificuldade e 4 pactos com modificadores de risco/recompensa.
- Missões diárias, meta-progresso e árvore de talentos permanente.
- 3 slots de run independentes com estado completo salvo.
- Interface 100% temática medieval com sprites ornamentados.
| Personagem | HP | Velocidade | Dano | Mana | Ultimate |
|---|---|---|---|---|---|
| Guerreiro | 100 | 280 | 25 | 50 | Fúria do Guerreiro |
| Caçador | 63 | 340 | 38 | 75 | Chuva de Flechas |
| Mago | 75 | 260 | 25 | 200 | Congelamento Temporal |
| Vampire | 88 | 300 | 38 | 100 | Tempestade Sombria |
| Demônio | 75 | 290 | 38 | 100 | Chama Infernal |
| Golem | 113 | 240 | 50 | 50 | Golpe da Terra |
Todos os personagens estão desbloqueados por padrão. Cada personagem possui spritesheets direcionais (cima/baixo/esquerda/direita) com animações de andar e atacar carregadas via characters.py.
| Tipo | HP base | Vel. base | Aparição | Descrição |
|---|---|---|---|---|
| Bat | 28 | 145 | 0s | Morcego com movimento senoidal |
| Runner | 50 | 150 | 0s | Corredor rápido em linha reta |
| Tank | 260 | 65 | 30s | Alto HP, lento, corpo a corpo |
| Shooter | 80 | 90 | 30s | Atira projéteis à distância |
| Goblin | 80 | 160 | 1 min | Rápido com zigzag moderado |
| Beholder | 200 | 85 | 1.5 min | Flutuante, movimento suave |
| Orc | 300 | 75 | 3 min | Grande, corpo a corpo tanque |
| Elite | 1500 | 85 | 30s+ | Versão reforçada com drop de ouro garantido |
HP e velocidade escalam com o multiplicador de dificuldade e com o tempo de jogo (+20 % de HP/dano por minuto até 6×).
| Tipo | HP base | Vel. base | Aparição | Descrição |
|---|---|---|---|---|
| Slime | 130 | 110 | 30s | Inimigo equilibrado com aura escura |
| Minotauro | 200 | 130 | 30s | Corpo a corpo, perseguição direta |
| Rat | 150 | 135 | 2 min | Grande (220px), zigzag agressivo |
Aparecem somente quando o bioma selecionado é Vulcão, a partir de 2 minutos de jogo.
| Tipo | HP base | Vel. base | Aparição | Descrição |
|---|---|---|---|---|
| Slime Fire | 280 | 125 | 2 min | Arrancada de fogo (2.8× vel), alto dano de contato |
| Slime Red | 220 | 110 | 2 min | Tanque lento com alto HP |
| Slime Yellow | 160 | 145 | 2 min | Ágil, menos HP, ataque rápido |
| Tipo | HP base | Aparição | Descrição |
|---|---|---|---|
| Mini Boss | 6000 | ~10 min | Barra de vida própria, escala com tempo (+30 % × time_scale) |
| Chefe | escalável | 5 min (a cada 5 min) | Multi-fase, fica mais forte a cada onda |
| Agis | 10000 | 15 min (selo de invocação) | Boss lento, orbe dupla + magia em área a cada 5s (+25 % × time_scale) |
Agis é invocado por um selo animado (doom_agis.png) que aparece próximo ao herói ~30s antes do spawn. Possui ataque básico de projétil (orbe dupla roxa) e magia em área que dispara 8 orbes em todas as direções. Dropa baú + 15 moedas ao morrer.
Hordas são processadas em fila assíncrona (6 inimigos/frame) eliminando travamentos de CPU. Obstáculos surgem gradualmente desde o início da run — não em massa durante hordas.
- Pool de 218 upgrades com 4 raridades: Comum, Raro, Épico, Lendário.
- A cada nível o jogador escolhe 1 entre 5 opções (teclas 1–5 ou mouse).
- Sinergia: upgrades anteriores influenciam as opções oferecidas.
- Evoluções desbloqueiam versões aprimoradas ao atingir nível máximo.
TREVO SORTEaumenta a raridade das próximas ofertas.- Notificações visuais com fade-out ao aplicar upgrades.
| Categoria | Quantidade | Exemplos de efeitos |
|---|---|---|
| Dano e Ataque | 30 | +dano, +crítico, execute, cadência |
| Projéteis | 25 | +projéteis, pierce, ricochete, velocidade |
| Defesa | 30 | +HP, regen, espinhos, lifesteal, vampirismo |
| Velocidade | 20 | +velocidade do herói, coleta |
| Magia / Orbes | 25 | orbes orbitais, explosões mágicas, combinações |
| Explosão | 15 | raio de explosão, dano em área |
| Utilidade | 30 | magnetismo, ouro, bônus de XP, cura |
| Especial | 25 | habilidades raras e combinações únicas |
| Upgrades clássicos | 18 | Fúria Demoníaca, Barreira de Gelo, etc. |
Novos mecânicos introduzidos pelos upgrades:
- Lifesteal — percentual do dano causado devolvido como HP.
- Multiplicador de ouro — aumenta o valor de moedas coletadas na run.
- Bônus de XP — aumenta XP ganho por gemas durante a run.
Modificadores opcionais escolhidos antes da run:
| Pacto | Efeito | Bônus |
|---|---|---|
| Sem Pacto | Nenhum modificador | — |
| Pacto da Pressa | Inimigos 50% mais rápidos | +50% Ouro |
| Pacto Frágil | -2 HP máximo | +30% XP |
| Dificuldade | HP inimigos | Velocidade | Dano | Ouro |
|---|---|---|---|---|
| Fácil | 0.7x | 0.8x | 0.5x | 0.8x |
| Médio | 1.0x | 1.0x | 1.0x | 1.0x |
| Difícil | 1.5x | 1.15x | 1.5x | 1.4x |
| Hardcore | 2.5x | 1.3x | 2.0x | 2.0x |
Difícil e Hardcore são desbloqueados por missões específicas.
| Bioma | Decorações | Trilha | Inimigos exclusivos |
|---|---|---|---|
| Dungeon | Decorações de chão animadas (pentagrama, dinossauro) via DungeonDecoManager |
Sim | — |
| Floresta | Tilemap composto com tiles animados (fogueira, bandeira) via ForestDecoManager |
Sim | — |
| Vulcão | Rochas, geiseres e colisões de ambiente via VolcanoDecoManager |
Sim | Slime Fire, Slime Red, Slime Yellow |
| Lua | Decorações temáticas de superfície lunar via MoonDecoManager |
Sim | — |
A loja possui quatro abas principais:
| Aba | Categorias | Total de itens |
|---|---|---|
| Armas | Espadas, Machados, Lanças, Arcos, Cajados | 60 |
| Armaduras | Capacetes (12), Armaduras (12), Calças (12), Botas (10) | 46 |
| Utilitários | (em desenvolvimento) | — |
| Vender | Todos os itens do inventário | — |
Itens são comprados com ouro, ficam no inventário e podem ser arrastados para os slots de equipamento (drag-and-drop). Cada categoria tem estatísticas balanceadas com a progressão do jogo:
- Armas: aumentam ATK do personagem.
- Escudos: aumentam DEF e contribuem para Resistência a Dano.
- Capacetes, Armaduras, Calças e Botas: cada peça tem valor de DEF que contribui para Resistência a Dano (DEF / 600 por peça, cap total 55%).
Cada peça de armadura equipada reduz o dano recebido:
DAMAGE_RES = min(0.55, shield_def / 600 + soma(armor_def) / 600)
O painel de Status (tecla C) exibe os nomes das peças equipadas e a porcentagem de Resistência resultante.
- Missões com recompensas em ouro.
- Árvore de talentos permanente com painel expandido para acomodar todos os talentos por caminho.
- Unlocks de personagens, dificuldades e cosméticos por conquistas.
Toda a interface usa sprites ornamentados medievais com fundo transparente (Photoroom). O texto é sempre renderizado dinamicamente por cima — nenhum texto fica gravado na imagem.
| Elemento | Sprite |
|---|---|
| Botões de todos os menus | Barras de interface medieval ornamentada-Photoroom.png (7 barras) |
| Cartas de seleção de skill (level-up) | skills.png (3 cartas) |
| Título e seção de configurações | config.png (barra grande + barra pequena) |
| Painéis de seleção de personagem | painelguerreiro.png, painelcacador.png, painelmago.png |
| Tela de seleção de dificuldade | selecionar_dificuldade.png |
| Sala do Herói (hub) | sala_do_heroi.png — botões Loja, Talentos e Pronto alinhados aos retângulos da imagem |
| Status do personagem (C) | status.png — nome, atributos e equipamentos alinhados às zonas da imagem |
| Inventário e equipamentos (I) | inventario.png — grade de itens + slots de arma, escudo, capacete, armadura, calças e botas |
O AssetLoader usa cache recursivo (_build_cache): arquivos podem estar em qualquer subpasta de assets/ e são encontrados pelo nome sem alterar nenhuma chamada de código.
| Arquivo | Responsabilidade |
|---|---|
jogo_final.py |
Loop principal, estados de jogo, UI |
balance.py |
Fórmulas de progressão: XP, escala de inimigos, custo de upgrades, drop rates |
characters.py |
Classes de personagem, habilidades e ultimates |
enemies.py |
Inimigos, IA direcional, spritesheets, projéteis inimigos |
hud.py |
HUD in-game, tema visual, notificações de upgrade |
upgrades.py |
Pool de upgrades, sinergia, evoluções |
drops.py |
Gemas, itens e lógica de coleta |
combat/projectiles.py |
Projéteis, slashes e explosões com cache de frames |
forest_biome.py |
Tilemap de floresta, decorações animadas |
dungeon_biome.py |
Decorações de chão do dungeon |
volcano_biome.py |
Decorações, rochas e geiseres do vulcão |
moon_biome.py |
Decorações da superfície lunar |
spatial_index.py |
Índices espaciais, pathfinding A* em grid, métricas |
hot_kernels.py |
Kernels NumPy + Numba JIT com detecção automática de backend Cython |
hot_kernels_cy.pyx |
Implementação acelerada opcional em Cython |
- Fila de spawn de hordas: producer/consumer (6 inimigos/frame) — elimina picos de CPU.
- Cache de explosões: indexado por
(id(raw_frames), size)— evita reescalonamento repetido. - AssetLoader recursivo:
os.walkemassets/mapeia stem → path completo; mover arquivos não quebra o código. - Resolução dinâmica:
pygame.display.list_modes()detecta modos do monitor em tempo real. - Spawn gradual de obstáculos: timer decrescente desde o início da run em vez de bulk em hordas.
- Fallback em camadas: Cython opcional → Numba JIT → NumPy puro → Python puro, tudo automático.
- Double buffering:
pygame.DOUBLEBUFativo por padrão — reduz tearing e habilita aceleração de hardware no SDL2.
- Python 3.12+
- Windows, Linux ou macOS
- Dependências runtime:
pygame-ce2.5.7+ (Community Edition com SDL 2.32.10 ou superior)numpy2.4.4+numba0.65+ (JIT de kernels críticos; opcional mas recomendado)
Atenção: O projeto usa pygame-ce (Community Edition), não o pygame original. Instalar ambos simultaneamente causa conflito — desinstale
pygameantes de instalarpygame-ce.
O projeto migrou para Pygame Community Edition (Pygame-CE) pelos seguintes benefícios:
- Drop-in replacement — API 100% compatível com pygame original, sem refatoração necessária.
- Melhor performance — Otimizações em drivers SDL2, redução de overhead em renderização e eventos.
- Suporte SDL3 (futuro) — Aceleração GPU via SDL3: melhor FPS em cenas complexas com muitos sprites.
- Manutenção ativa — Comunidade open-source mantendo e atualizando regularmente.
- Recursos extras — Suporte aprimorado a spritesheets, efeitos de blending e transformações.
No contexto deste jogo (survivor com 100+ inimigos + UI animada), o Pygame-CE proporciona FPS mais consistente, especialmente em modos difíceis com muitas partículas e projéteis.
git clone https://github.com/HelioASjunior/underworld-hero-survivor.git
cd underworld-hero-survivorWindows:
py -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1Linux/macOS:
python3.12 -m venv .venv
source .venv/bin/activatepip install -r requirements.txtIsso instala:
pygame-ce2.5.7 (Community Edition)numpy2.4.4 (processamento rápido de arrays para IA espacial)numba(compilador JIT para o kernel de separação de inimigos)
Se já tiver
pygame(original) instalado, remova compip uninstall pygameantes.
python -c "import pygame; print(f'Pygame-CE versão: {pygame.version.vernum}')"
python -c "import numpy; print(f'NumPy versão: {numpy.__version__}')"
python -c "import hot_kernels; print('NUMBA_ACTIVE =', hot_kernels.NUMBA_ACTIVE)"python jogo_final.pySem ativar o venv (Windows):
.\venv\Scripts\python.exe jogo_final.pyPrimeira execução: O jogo criará settings.json e save_v2.json na primeira vez. Na primeira inicialização com Numba, o kernel de separação é compilado e cacheado em disco (~2s extra uma única vez).
O jogo já é otimizado em múltiplas camadas:
| Camada | Mecanismo | Benefício |
|---|---|---|
| Display | pygame.DOUBLEBUF ativo por padrão |
Double buffering, reduz tearing |
| Renderização | Pygame-CE com SDL2 | Mais eficiente que pygame original |
| Cache de chão | Surface pré-renderizada do tilemap | ~54 blits/frame → 1 blit/frame no fundo |
| Frame time | Média móvel de 6 frames no dt |
Elimina micro-stutters do Windows Scheduler |
| Separação de inimigos | Numba @njit(cache=True) |
Kernel JIT compilado para código nativo |
| Consultas espaciais | NumPy vetorizado (EnemyBatchIndex) |
Buscas O(n) em array sem loop Python |
| Spawn de hordas | Fila assíncrona (6/frame) | Elimina picos de CPU ao spawnar grupos |
| Cache de frames | Indexado por (id(raw_frames), size) |
Sprites efeito pre-escalados, sem recomputar |
Para ganho adicional de performance nos kernels de pathfinding e IA, compile a extensão Cython. Sem ela o jogo funciona normalmente via Numba + NumPy — a compilação é totalmente opcional.
| Kernel | Função | Ganho típico |
|---|---|---|
radius_indices |
Inimigos dentro de raio (colisão de projéteis, pick-up range) | 4–6× vs Python puro |
nearest_index |
Inimigo mais próximo respeitando máscara de exclusão (targeting) | 4–6× vs Python puro |
batch_directions |
Direção normalizada para N inimigos de uma vez (movimento em batch) | 6–10× vs Python puro |
astar_cy |
Pathfinding A* com variáveis C internas, sem overhead de atributo Python | 4–8× vs Python puro |
positions_in_rect |
Índices dentro de retângulo para ataques AOE (slash, cone) | 4–6× vs Python puro |
enemy_separation |
Separação/repulsão entre inimigos (Numba @njit) |
3–6× vs Python puro |
O módulo hot_kernels.py detecta automaticamente qual backend está disponível e usa fallback individualmente: Cython → Numba JIT → NumPy → Python puro.
| Teste | Tempo |
|---|---|
radius_indices × 1000 chamadas |
~12.6 ms |
batch_directions × 1000 chamadas |
~14.5 ms |
astar_cy × 500 chamadas |
~59.5 ms |
pip install -r requirements-dev.txtwinget install BrechtSanders.WinLibs.POSIX.UCRTApós instalar, abra um novo terminal e compile:
python build_cython.py build_ext --inplaceInstale o Visual C++ Build Tools 2019+ e compile:
python build_cython.py build_ext --inplacepython -c "import hot_kernels; print('CYTHON_ACTIVE =', hot_kernels.CYTHON_ACTIVE, '| NUMBA_ACTIVE =', hot_kernels.NUMBA_ACTIVE)"O projeto inclui dois scripts de empacotamento para distribuir o jogo sem Python instalado.
pip install -r requirements-dev.txt
python build_dist.py # pasta dist/UnderWorldHero/
python build_dist.py --onefile # executável único dist/UnderWorldHero.exe
python build_dist.py --clean # limpa antes de empacotarResultado: dist/UnderWorldHero/UnderWorldHero.exe ou dist/UnderWorldHero.exe
Nuitka converte Python → C → executável nativo. Inicialização mais rápida, ~10–30% de ganho de velocidade em execução vs PyInstaller.
Pré-requisito: compilador C no PATH (WinLibs GCC ou Visual C++ Build Tools).
pip install -r requirements-dev.txt
python build_nuitka.py # pasta dist-nuitka/jogo_final.dist/
python build_nuitka.py --onefile # executável único
python build_nuitka.py --clean # limpa antes de compilarResultado: dist-nuitka/jogo_final.dist/jogo_final.exe ou dist-nuitka/jogo_final.exe
Reconfiguráveis em Configurações → Controles:
| Ação | Padrão |
|---|---|
| Movimentação | W A S D |
| Dash | Space |
| Ultimate | E |
| Pausar / Retomar | P |
| Menu rápido | Esc |
| Overlay de debug | F3 |
| Selecionar upgrade | 1 / 2 / 3 / 4 / 5 ou clique |
| Abrir inventário / equipamentos | I |
| Abrir status do personagem | C |
| Arquivo | Conteúdo |
|---|---|
settings.json |
Vídeo, áudio, controles, gameplay, acessibilidade |
save_v2.json |
Progresso global: ouro, talentos, unlocks, estatísticas |
run_slot_1~3.json |
Estado completo de cada slot de run |
Seções das configurações:
- Vídeo: resolução (dinâmica), tela cheia, VSync, limite de FPS, mostrar FPS.
- Audio: volume de música, volume de efeitos, mudo.
- Controles: remapeamento de teclas.
- Gameplay: auto-aplicar recompensa de baú, indicadores de inimigos fora de tela.
- Acessibilidade: opções extras de visualização.
A lista de resoluções é detectada automaticamente via pygame.display.list_modes() ao abrir as configurações. Nenhum valor está fixo no código.
Exemplo de resoluções detectadas (variam por monitor):
1280x720 1366x768 1600x900 1920x1080 2560x1440 3840x2160
Comportamento de fallback:
- Se a resolução salva não couber no monitor atual → usa resolução nativa.
- Se o monitor não reportar lista de modos → usa lista padrão até 4K.
- Se
pygame.display.set_modefalhar com as flags escolhidas → abre em janela simples com double buffering.
- FPS e tempo médio de frame.
- Contagem de inimigos, projéteis e partículas em tela.
- Consultas espaciais por frame e taxa de cache hit do A*.
- Backend ativo: Cython ON / Numba ON / NumPy fallback.
python benchmark_spatial.pyunderworld-hero-survivor/
├── jogo_final.py # Loop principal e estados de jogo
├── balance.py # Fórmulas de balanceamento e progressão
├── characters.py # Personagens jogáveis
├── enemies.py # Inimigos, IA e animações
├── hud.py # HUD e interface in-game
├── upgrades.py # Upgrades, sinergia e evoluções
├── drops.py # Gemas e drops
├── forest_biome.py # Bioma floresta (tilemap + decorações animadas)
├── dungeon_biome.py # Bioma dungeon (decorações de chão)
├── volcano_biome.py # Bioma vulcão (rochas, geiseres, colisões)
├── moon_biome.py # Bioma lua (decorações lunares)
├── spatial_index.py # Indexação espacial e pathfinding
├── hot_kernels.py # Kernels NumPy / Numba / Cython
├── hot_kernels_cy.pyx # Extensão Cython (opcional)
├── benchmark_spatial.py # Benchmark de performance
├── build_cython.py # Script de build Cython
├── build_dist.py # Script de empacotamento PyInstaller
├── build_nuitka.py # Script de compilação Nuitka (binário nativo)
├── combat/
│ └── projectiles.py # Projéteis e explosões
├── assets/
│ ├── audio/ # Músicas e efeitos (.mp3)
│ ├── backgrounds/ # Fundos dos biomas
│ ├── characters/ # Sprites dos personagens
│ ├── effects/ # Auras, explosões, slashes, orbes
│ ├── enemies/ # Sprites de inimigos e chefes
│ ├── fonts/ # Fontes medievais
│ ├── icons/ # Ícones de upgrades e talentos
│ ├── items/ # Gemas e itens coletáveis
│ ├── sprite/
│ │ └── monster/ # Spritesheets direcionais de monstros
│ └── ui/
│ ├── buttons/ # Barras ornamentadas, skills.png, config.png
│ ├── chao/ # Decorações de chão (dungeon)
│ ├── menu_icons/ # Ícones do menu principal
│ ├── panels/ # Painéis de seleção de personagem
│ ├── tiles/ # Tiles de bioma (estáticos e animados)
│ └── newItens/ # Ícones de armaduras (capacete/, armor/, calças/, botas/)
├── settings.json # Configurações salvas
├── save_v2.json # Progresso global
├── requirements.txt # Dependências runtime (pygame-ce, numpy, numba)
└── requirements-dev.txt # Dependências de build (Cython, PyInstaller)
Causa: O ambiente não está ativado ou pygame-ce não foi instalado.
Solução:
# Ativar venv
.\venv\Scripts\Activate.ps1 # Windows
source venv/bin/activate # Linux/macOS
# Reinstalar pygame-ce
pip uninstall pygame pygame-ce -y
pip install pygame-ce==2.5.7Causa: Pygame não conseguiu acessar o driver de vídeo (Linux headless, WSL sem display).
Solução:
# Linux: instalar SDL2
sudo apt-get install libsdl2-2.0-0 libsdl2-dev
# Verificar instalação
python -c "import pygame; pygame.init(); print('OK')"Otimizações:
- Reduzir resolução em Configurações > Vídeo (tente 1280x720).
- Desabilitar VSync se o jogo ficar travado inconsistentemente.
- Compilar Cython para kernels de IA mais rápidos:
python build_cython.py build_ext --inplace
- Verificar Numba ativo (
NUMBA_ACTIVE = True):python -c "import hot_kernels; print(hot_kernels.NUMBA_ACTIVE)" - Fechar aplicações em background (Discord, Chrome, etc).
Causa: Compilador C não encontrado.
Solução rápida (recomendada) — WinLibs GCC ~255 MB:
winget install BrechtSanders.WinLibs.POSIX.UCRT
# Abra um novo terminal após instalar para o PATH ser atualizado
python build_cython.py build_ext --inplaceSolução alternativa — Visual C++ Build Tools ~5 GB:
Instale Visual C++ Build Tools 2019+ do site oficial da Microsoft e tente novamente:
python build_cython.py build_ext --inplaceVerificar se GCC está no PATH:
gcc --version- Novos biomas com mecânicas exclusivas.
- Boss Agis — invocação por selo, ataque à distância e magia em área.
- Novos chefes com fases e ataques adicionais.
- Sistema de conquistas com recompensas visuais.
- Sistema de balanceamento contínuo de progressão e economia (
balance.py). - Build distribuível para Windows (.exe) via PyInstaller (
build_dist.py) e Nuitka (build_nuitka.py). - Suporte a controle gamepad.
- Migrar para Pygame-CE (concluído com sucesso).
- Aba ARMADURAS na loja com 46 itens em 4 categorias (capacetes, armaduras, calças, botas).
- Sistema de resistência a dano por armaduras equipadas.
- Drag-and-drop para todos os slots de equipamento (arma, escudo, capacete, armadura, calças, botas).
- Painel de status (C) e Sala do Herói alinhados às zonas das imagens de UI.
- Árvore de talentos com painel expandido para acomodar todos os talentos por caminho.
- 218 upgrades divididos em 8 categorias com sistema de sinergia.
- Seleção de 5 upgrades por nível (teclas 1–5).
- Novas mecânicas de run: lifesteal, multiplicador de ouro, bônus de XP.
- Numba JIT no kernel de separação de inimigos (
hot_kernels.py). - Double buffering (
pygame.DOUBLEBUF) para reduzir tearing. - Cache de chão — tilemap pré-renderizado (~54 blits/frame → 1 blit/frame).
- Frame time smoothing — média móvel de 6 frames elimina micro-stutters.
- Bioma Vulcão com decorações, geiseres e inimigos exclusivos.
- Bioma Lua com decorações temáticas.
- SDL3 quando Pygame-CE lançar (GPU acceleration e melhor performance).
- Multiplayer local (co-op para 2 jogadores).
- Abra uma issue descrevendo o bug, melhoria ou proposta.
- Crie uma branch a partir de
beta. - Envie um Pull Request com descrição do que foi alterado e como testar.
Diretrizes: CODE_OF_CONDUCT.md
Licença proprietária com codigo disponivel (source-available). O codigo esta disponivel apenas para visualizacao e fins educacionais. Compilacao, redistribuicao e venda do codigo-fonte ou binario sao proibidas. Todos os direitos de exploracao comercial sao reservados ao autor. Consulte LICENSE.
