THE NEXT IMPROVEMENT COULD BE YOURS
Find your way to contribute.
You do not need to know the entire engine. Choose a small task, follow the guide for your area, and deliver something someone else can verify.
Programming
Movement, attacks, collisions, and regressions.
C++ and Python →Research
Turn observations into reproducible references.
Video and measurements →Sprites
Correct frames, palettes, and character alignment.
Pixel art →Audio
Smooth loops, effects, and the right timing to play them.
Music and SFX →Tests
Find the first error and help reproduce it.
Without programming →Before the first mission.
- Choose a concrete gapOpen an entry in the enemy catalog and see the next task. You can also report a control, stage, or audio problem.
- Check the task on GitHubRead the issues and describe the scope you want to take on. This helps avoid two people fixing the same problem.
- Deliver it with a way to verify itA small change, the reference used, and steps to verify the result are a great start.
GUIDE 01
Programming
For contributors who want to improve the public source and contracts.
The first public package provides C++17 source, a buildable core and 15 asset-independent contracts. Start with a small logic, test, documentation or portability task.
Step by step: set up the environment on Windows
Install Git and MSYS2. Use the MINGW64 package family below.
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-jsonFork the repository on GitHub to submit changes. Anyone can clone the public source to start reading and testing:
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-failureThe PowerShell example assumes MSYS2 is installed at C:\msys64. The default build compiles the core and runs contracts without a ROM, window or assets. The full executable requires separate data and is not the starting point.
Read the checkout instructions
Start with AGENTS.md ↗ and CONTRIBUTING.md ↗. Suggested tests cover screen transforms, JSON files, animation and path containment. Check existing contracts before adding another.
Find the code that applies the rule
enemy.cpp ↗ contains enemy behavior; kb_fsm.cpp ↗ is the state machine interpreter. Reference definitions and captures are not included with the public source. Identify the required data before proposing new values.
Reproduce with a small input
Use data created in memory or temporary files. Input bindings contract ↗ is an example; PublicTests.cmake ↗ lists the public selection. The test should demonstrate a real failure or a rule that is not covered yet.
Submit a reviewable pull request
Create a branch in your fork, inspect the diff and submit the change with the test command and result. Human review decides whether to merge. If the case needs missing material, submit the investigation and the exact requirement.
Expected deliverable
A small change or verifiable investigation, the files consulted, the tests actually run and the limits. A passing contract does not prove a complete stage or fidelity to the original.
GUIDE 02
Research and references
Help turn an observation into a rule that can be checked.
A useful measurement answers a small question: which side the projectile starts from, what event starts an attack, or on which frame the enemy changes state.
Define the question and control
Choose the entry, stage, and a reproducible situation. For shot direction, for example, compare X on the left and right while keeping the same attack situation. A video already helps locate the problem.
Identify the reference
Record the game version, initial state, and commands used. For advanced research, the project uses Mesen and Lua with a compatible local reference. Ask for guidance about the fixture: it is an emulator reference state, not a file interchangeable between arbitrary configurations.
Record the first deviation
Count frames, describe the position, and record the enemy state when possible. Distinguish world, camera, and image coordinates: the same number in different coordinate bases can look like a correction and introduce an error.
Deliver reduced data
A short table with frame, action, position, speed, HP, and event is usually more useful than a huge package. Include the capture recipe and examples that confirm or reject your hypothesis.
Advanced tutorial: validate a fixture and start a trace
These commands belong to the private research environment and are not included in the public source. They require a configured Mesen installation and compatible local materials. Validate the reference state before measuring:
./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.mssThe example below uses the existing Intro Highway probe. It has specific targets described in Lua; it does not automatically apply to every enemy.
$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 a new output folder for each attempt and check the fields actually emitted. Before expanding the capture, review the probe private materials and the fixture guide private materials.
Expected deliverable
Investigated question, identified reference, reproducible steps, short table, and a conclusion with limits. You do not need to attach the ROM or raw dumps to the report.
GUIDE 03
Sprites and pixel art
Small pose, color, and alignment adjustments can fix very visible defects.
You can help recover an incorrect frame, identify a palette, or find out why the character appears to “jump” between poses. The entry indicates when the art has already been verified and the problem lies elsewhere.
Choose a frame, not the whole sheet
Report the character, animation, frame index, and visual reference. Separate an incorrect drawing from a correct frame used at the wrong time.
Preserve the anchor point
Compare the feet, body center, and projectile origin at the same position. Keep the cell dimensions, transparency, frame order, and alignment. Changing the crop can alter the appearance even when the drawing is identical.
Check the palette and both directions
Use the reference colors and also check the damage or shooting frames. Some sheets have a separate flash version. Do not mirror a character just by convention: Axe Max, for example, has its own documented orientation.
Deliver a clear comparison
Include before/after at the same scale, the changed cell, the editable file, and the material source. If the art is correct and the sequence is wrong, the adjustment may belong in the animation definition.
Example: prepare a candidate Met sheet
The packer aligns frames by their base. With the build folder created during environment setup, the output below can be reviewed before replacing a game sheet.
./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 32The command provides the dimensions and a configuration example. Check the packer private materials and the sprite convention private materials. This workflow must not regenerate sheets with their own contract, such as axemax_sheet.png.
Expected deliverable
Identified frame, art source, editable file, and a comparison with alignment and palette preserved. For original art or a visual variant, present the proposal before replacing project material.
GUIDE 04
Music and effects
Precision in the loop, the file, and when the event plays.
There is work both in listening and implementation: locating an audible restart, measuring the loop, identifying a missing effect, or checking when the sound should play.
Identify the track or event
Report the stage and situation. For an effect, record the action that should produce it. For music, separate the intro, repeat, and any pause caused by another game event.
Mark the loop boundary
Record the sample rate and the start/end positions in audio frames. These are PCM samples per channel, not game frames. The intro should play once and the selected section should repeat without an audible cut.
Use the engine's format and map
Music without a configured loop region may use OGG; effects use WAV. When the track has
loopa configured loop, as Flame Mammoth does, the current path requires 16-bit PCM WAV with compatible channels and sample rate. An OGG alone does not prepare this case. bgm.json private materials connects stages to tracks. The loop reference for Flame Mammoth private materials shows the fieldsstart_frame,end_frame,sample_rateand the measurement source.Listen to the transition, then check it in the game
Play several loops and compare the seam. For SFX, also check the timing of the attack or presentation. Replacing a sample does not fix an event triggered on the wrong frame.
Example: validate the loop region
After preparing the build, the contract below checks bounds, sample rate, and invalid data. It complements listening and the stage test.
ctest --test-dir build -R audio-loop --output-on-failureRead the loop test private materials and the audio manager ↗. The common importer produces BGM in OGG; a track with a loop also needs compatible PCM WAV prepared for this path. The scripts use specific local materials; coordinate the source with the maintainer before running them or replacing tracks.
Expected deliverable
Identified track/event, authorized source, sample rate, loop region or effect timing, and an audio comparison. If you compose, send a proposal for original music or a variant with clear authorship and usage conditions.
GUIDE 05
Test and report
You do not need to know how to program to help improve the project.
You can contribute without writing code. A report that allows the problem to be reproduced saves time and helps verify that the fix really solved the case.
Shorten the path to the error
Record the stage, section, commands, and whether you reached it through the menu, a respawn, or the test map. Say whether there was a dash, charged shot, wall, or change of direction.
Show the first strange moment
A short video is great for animation and audio. For collision, explain where the shot or body should make contact. If it only happens sometimes, report the attempts that worked and those that failed.
Identify the tested version
Include the commit or package you received. If you have access to the build, the log is
logs/megaman-x.login the executable's folder. Send only the relevant excerpt after checking its contents.Check again after the fix
Repeat the same steps and also a nearby case: the other side of the enemy, a shot at another height, or returning after dying. This distinguishes a robust fix from an adjustment that works in only one situation.
Report template to copy
Character / problem:
Stage and section:
Project version or commit:
System / Windows version:
Command, test profile, or menu path:
Fixture, initial position, and seed (if applicable):
Compiler / toolchain (if you compiled):
Steps to reproduce:
1.
2.
3.
What I expected:
What happened:
Does it happen every time or sometimes?
First incorrect moment in the video:
Link to short video / capture / log:Expected deliverable
Clear steps, identified version, expected versus observed, and a small example. The maintainer should be able to reproduce the problem without guessing the path you took.
Questions from newcomers.
Can I help without code access?
Yes. You can choose a public task, offer research, review art or audio, or report a test with a package you have received. The source is now public: make a fork and propose a change through a pull request.
Is an enemy with a sprite already complete?
Not necessarily. The entry separates what exists, verified fixes, and what still needs to be measured or integrated. A thumbnail only shows visual identity; it does not prove movement, attacks, or complete fidelity.
How do I avoid duplicating someone else's work?
Before starting, send the entry link and describe the scope you intend to take on. The catalog is a reviewed snapshot of the project; task availability must be coordinated with the maintainer.
Can I send the ROM or a package of game files?
It is not necessary. Share the identified reference, recipe, reduced tables, and agreed contribution files. ROMs and local emulation materials are not part of the public deliverable.
How does a task become considered verified?
When the reference is identified, the change is integrated, and the appropriate verification passes. Video, automated tests, and comparison with the original answer different questions; the entry must say which part each one proves.