A PRÓXIMA MELHORIA PODE SER SUA
Encontre seu jeito de contribuir.
Não precisa conhecer o motor inteiro. Escolha uma tarefa pequena, siga o guia da sua área e entregue algo que outra pessoa consiga conferir.
Programação
Movimento, ataques, colisões e regressões.
C++ e Python →Pesquisa
Transforme observações em referências reproduzíveis.
Vídeo e medições →Sprites
Quadros corretos, paletas e alinhamento de personagens.
Pixel art →Áudio
Loops suaves, efeitos e momento certo de tocar.
Música e SFX →Testes
Encontre o primeiro erro e ajude a reproduzi-lo.
Sem programar →Antes da primeira missão.
- Escolha uma lacuna concretaAbra uma ficha no catálogo de inimigos e veja a próxima tarefa. Você também pode relatar um defeito de controle, fase ou áudio.
- Confira a tarefa no GitHubLeia as issues e descreva o recorte que quer assumir. Isso evita duas pessoas corrigindo o mesmo problema.
- Entregue com uma forma de conferirUma mudança pequena, a referência utilizada e os passos para verificar o resultado são um ótimo começo.
GUIA 01
Programação
Para quem quer melhorar o código e os contratos públicos.
O primeiro pacote público oferece código C++17, um núcleo compilável e 15 contratos independentes de assets. Use uma tarefa pequena de lógica, teste, documentação ou portabilidade para começar.
Passo a passo: preparar o ambiente no Windows
Instale Git e MSYS2. Use a família MINGW64 dos pacotes abaixo.
pacman -S --needed mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja mingw-w64-x86_64-raylib mingw-w64-x86_64-nlohmann-jsonFaça um fork no GitHub para enviar mudanças. Para começar a ler e testar, qualquer pessoa pode clonar o código público:
git clone https://github.com/davidluky/megaman-x-engine.git
cd megaman-x-engine
$env:PATH = "C:\msys64\mingw64\bin;C:\msys64\usr\bin;" + $env:PATH
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build -j 8
ctest --test-dir build --output-on-failureO exemplo de PowerShell considera o MSYS2 instalado em C:\msys64. O build padrão compila o núcleo e executa contratos sem ROM, janela ou assets. O executável completo exige dados separados e não é o caminho inicial.
Leia as instruções do checkout
Comece por AGENTS.md ↗ e CONTRIBUTING.md ↗. Há propostas de testes para transformação de tela, arquivos JSON, animação e contenção de caminhos. Confira os contratos existentes antes de adicionar outro.
Encontre quem executa a regra
enemy.cpp ↗ contém o comportamento dos inimigos; kb_fsm.cpp ↗ é o interpretador de máquinas de estados. As definições e capturas de referência não acompanham o código público. Identifique o dado necessário antes de propor valores novos.
Reproduza com uma entrada pequena
Use dados criados em memória ou arquivos temporários. Contrato de controles ↗ é um exemplo; PublicTests.cmake ↗ registra a seleção pública. O teste deve mostrar uma falha real ou uma regra ainda sem cobertura.
Envie um pull request revisável
Crie uma branch no seu fork, confira o diff e envie a mudança com o comando de teste e o resultado. A revisão humana decide a integração. Se o caso precisar de material ausente, entregue a investigação e o requisito exato.
Entrega esperada
Uma alteração pequena ou investigação verificável, os arquivos consultados, os testes realmente executados e os limites. Um contrato verde não comprova uma fase completa nem fidelidade ao original.
GUIA 02
Pesquisa e referências
Ajude a transformar uma observação em uma regra que pode ser conferida.
Uma medição útil responde uma pergunta pequena: de que lado o projétil nasce, qual evento inicia um ataque ou em que quadro o inimigo muda de estado.
Defina a pergunta e o controle
Escolha a ficha, a fase e uma situação reproduzível. Para direção do tiro, por exemplo, compare X à esquerda e à direita, mantendo a mesma situação de ataque. Um vídeo já ajuda a localizar o problema.
Identifique a referência
Anote a versão do jogo, o estado inicial e os comandos usados. Para pesquisa avançada, o projeto usa Mesen e Lua com uma referência local compatível. Peça orientação sobre a fixture: ela é um estado de referência do emulador, não um arquivo intercambiável entre qualquer configuração.
Registre o primeiro desvio
Conte os quadros, descreva a posição e registre o estado do inimigo quando possível. Diferencie coordenadas do mundo, da câmera e da imagem: o mesmo número em bases diferentes pode parecer uma correção e introduzir um erro.
Entregue os dados reduzidos
Uma tabela curta com quadro, ação, posição, velocidade, HP e evento costuma ser mais útil que um pacote enorme. Inclua a receita de captura e exemplos que confirmam ou rejeitam sua hipótese.
Tutorial avançado: validar uma fixture e iniciar um trace
Estes comandos pertencem ao ambiente de pesquisa privado e não acompanham o código público. Exigem Mesen configurado e materiais locais compatíveis. Valide o estado de referência antes de medir:
./build/venv/Scripts/python.exe tools/oracle/check_recordings.py --brief
./build/venv/Scripts/python.exe tools/oracle/validate_fixture.py tools/oracle/fixtures/stage_select_thispc.mssO exemplo abaixo usa o probe existente da Intro Highway. Ele tem alvos específicos descritos no Lua; não serve automaticamente para qualquer inimigo.
$traceDir = Join-Path 'build/contributor' ('intro-enemy-trace-' + [guid]::NewGuid().ToString('N'))
./build/venv/Scripts/python.exe tools/oracle/run_mesen.py --game mmx1 --script tools/oracle/lua/enemy_behavior_trace.lua --savestate tools/oracle/fixtures/stage_select_thispc.mss --out $traceDir --timeout 120Use uma pasta de saída nova para cada tentativa e confira os campos realmente emitidos. Antes de ampliar a captura, revise o probe acervo privado e o guia de fixtures acervo privado.
Entrega esperada
Pergunta investigada, referência identificada, passos reproduzíveis, tabela curta e conclusão com limites. Não é necessário anexar a ROM ou dumps brutos ao relato.
GUIA 03
Sprites e pixel art
Ajustes pequenos de pose, cor e alinhamento podem resolver defeitos muito visíveis.
Você pode ajudar a recuperar um quadro incorreto, identificar uma paleta ou descobrir por que o personagem parece “pular” de posição entre poses. A ficha indica quando a arte já está verificada e o problema está em outra parte.
Escolha um quadro, não a folha inteira
Informe o personagem, a animação, o índice do quadro e a referência visual. Separe desenho errado de quadro correto usado no momento errado.
Preserve o ponto de apoio
Compare os pés, o centro do corpo e a origem do projétil na mesma posição. Mantenha dimensões da célula, transparência, ordem dos quadros e alinhamento. Alterar o recorte pode mexer na aparência mesmo que o desenho seja igual.
Confira a paleta e as duas direções
Use as cores da referência e confira também os quadros de dano ou tiro. Algumas folhas possuem uma versão de flash separada. Não espelhe um personagem só por convenção: o Axe Max, por exemplo, tem orientação própria documentada.
Entregue uma comparação clara
Inclua antes/depois na mesma escala, a célula alterada, o arquivo editável e a origem do material. Se a arte estiver correta e a sequência errada, o ajuste pode ser na definição da animação.
Exemplo: preparar uma folha candidata do Met
O empacotador alinha frames pela base. Com a pasta build criada na preparação do ambiente, a saída abaixo pode ser revisada antes de substituir uma folha do jogo.
./build/venv/Scripts/python.exe tools/pack_enemy_sprite.py --src content/x1/sprites/enemies/mmm-mmxmetoll.gif --dst build/met-candidate.png --cell-width 32 --cell-height 32O comando fornece as dimensões e um exemplo de configuração. Confira o empacotador acervo privado e a convenção de sprites acervo privado. Esse fluxo não deve regenerar folhas com contrato próprio, como axemax_sheet.png.
Entrega esperada
Quadro identificado, origem da arte, arquivo editável e comparação com alinhamento e paleta preservados. Para arte original ou uma variante visual, apresente a proposta antes de substituir material do projeto.
GUIA 04
Música e efeitos
Precisão no loop, no arquivo e no momento em que o evento toca.
Há trabalho tanto na escuta quanto na implementação: localizar um reinício audível, medir o loop, identificar um efeito ausente ou conferir quando o som deve tocar.
Identifique a faixa ou o evento
Informe a fase e a situação. Para um efeito, registre a ação que deveria produzi-lo. Para música, separe introdução, repetição e eventual pausa causada por outro evento do jogo.
Marque a fronteira do loop
Registre a taxa de amostragem e as posições inicial/final em frames de áudio. Elas são amostras PCM por canal, não quadros do jogo. A introdução deve tocar uma vez e o trecho escolhido deve repetir sem corte perceptível.
Use o formato e o mapa do motor
Música sem região de loop configurada pode usar OGG; efeitos usam WAV. Quando a faixa tem
loopconfigurado, como Flame Mammoth, o caminho atual exige WAV PCM de 16 bits, com canais e taxa de amostragem compatíveis. Um OGG sozinho não prepara esse caso. bgm.json acervo privado conecta as fases às faixas. A referência de loop do Flame Mammoth acervo privado mostra os camposstart_frame,end_frame,sample_ratee a origem da medição.Ouça a transição, depois confira no jogo
Reproduza várias voltas e compare a emenda. Para SFX, confira também o momento do ataque ou da apresentação. Trocar uma amostra não corrige um evento disparado no quadro errado.
Exemplo: validar a região de loop
Depois de preparar o build, o contrato abaixo verifica limites, taxa de amostragem e dados inválidos. Ele complementa a escuta e o teste da fase.
ctest --test-dir build -R audio-loop --output-on-failureLeia o teste de loop acervo privado e o gerenciador de áudio ↗. O importador comum produz BGM em OGG; a faixa com loop precisa também do WAV PCM compatível preparado para esse caminho. Os scripts usam materiais locais específicos; combine a origem com o mantenedor antes de executá-los ou substituir as faixas.
Entrega esperada
Faixa/evento identificado, origem autorizada, taxa de amostragem, região de loop ou timing do efeito e uma comparação auditiva. Se você compõe, envie uma proposta de música original ou variante com autoria e condições de uso claras.
GUIA 05
Teste e relate
Você não precisa saber programar para ajudar o projeto a melhorar.
Você pode contribuir sem escrever código. Um relato que permite repetir o problema economiza tempo e ajuda a conferir se a correção realmente resolveu o caso.
Reduza o caminho até o erro
Anote a fase, o trecho, os comandos e se chegou pelo menu, por respawn ou pelo mapa de teste. Diga se houve dash, tiro carregado, parede ou mudança de direção.
Mostre o primeiro instante estranho
Um vídeo curto é ótimo para animação e áudio. Para colisão, explique onde o tiro ou o corpo deveria tocar. Se só acontece às vezes, informe as tentativas que funcionaram e as que falharam.
Identifique a versão testada
Inclua o commit ou o pacote recebido. Se tiver acesso ao build, o log é
logs/megaman-x.logna pasta do executável. Envie apenas o trecho relevante, depois de conferir o conteúdo.Confira novamente depois da correção
Repita os mesmos passos e também um caso vizinho: outro lado do inimigo, um tiro em outra altura ou retorno após morrer. Isso separa uma correção robusta de um ajuste que só funciona em uma situação.
Modelo de relato para copiar
Personagem / problema:
Fase e trecho:
Versão ou commit do projeto:
Sistema / versão do Windows:
Comando, perfil de teste ou caminho pelo menu:
Fixture, posição inicial e seed (se houver):
Compilador / toolchain (se você compilou):
Passos para reproduzir:
1.
2.
3.
O que eu esperava:
O que aconteceu:
Ocorre sempre ou às vezes?
Primeiro instante incorreto no vídeo:
Link para vídeo curto / captura / log:Entrega esperada
Passos claros, versão identificada, esperado versus observado e um exemplo pequeno. O mantenedor deve conseguir repetir o problema sem adivinhar o caminho que você fez.
Dúvidas de quem está chegando.
Posso ajudar sem acesso ao código?
Sim. Você pode escolher uma tarefa pública, oferecer pesquisa, revisar arte/áudio ou relatar um teste com um pacote que tenha recebido. O código agora é público: faça um fork e proponha uma alteração por pull request.
Um inimigo com sprite já está concluído?
Não necessariamente. A ficha separa o que existe, as correções verificadas e o que ainda falta medir ou integrar. Uma miniatura só mostra a identidade visual, não comprova movimento, ataques ou fidelidade completa.
Como evito duplicar o trabalho de outra pessoa?
Antes de começar, envie o link da ficha e descreva o recorte que pretende assumir. O catálogo é uma fotografia revisada do projeto; a disponibilidade da tarefa precisa ser combinada com o mantenedor.
Posso enviar a ROM ou um pacote de arquivos do jogo?
Não é necessário. Compartilhe a referência identificada, a receita, tabelas reduzidas e os arquivos de contribuição combinados. ROMs e materiais locais de emulação não fazem parte da entrega pública.
Como uma tarefa passa a ser considerada verificada?
Quando a referência está identificada, a mudança foi integrada e a verificação adequada passou. Vídeo, teste automático e comparação com o original respondem perguntas diferentes; a ficha precisa dizer qual parte cada um comprovou.