Skip to content

Add Halo 1 MCC custom map (version 13) support - #241

Closed
chestahh wants to merge 8 commits into
OpenCommunityEdition:mainfrom
chestahh:codex/opence-mcc-review
Closed

chestahh wants to merge 8 commits into
OpenCommunityEdition:mainfrom
chestahh:codex/opence-mcc-review

Conversation

@chestahh

@chestahh chestahh commented Oct 10, 2026 •

Copy link
Copy Markdown

MCC CUSTOM MAP SUPPORT

Modern Halo 1 MCC version-13 custom maps cannot be loaded by OpenCE's Xbox or Custom Edition loaders.

This work adds support for modern Halo 1 MCC custom maps to OpenCE through an independently written compatibility layer. No code has been borrowed or otherwise repurposed from any MCC builds to prevent copyright infringement. It has been independently written and reverse-engineered with AI assistance.

Research included public documentation, existing OpenCE code/interfaces, as well as examining the version 13 (MCC) map format.

It converts supported MCC custom map data into formats OpenCE’s existing engine can use, allowing custom singleplayer scenarios and multiplayer maps to run within OpenCE.

MCC custom maps can use matching MCC sounds.map and bitmaps.map files placed alongside their levels in mcc_maps. Mods such as Halo Combat Revolved requires these resources. This expands the earlier self-contained-map support without using Custom Edition’s resource files or loader. The player will have to add these to the mcc_maps folder themselves, the exact same way they would for Custom Edition map support.

Players need to have a legally-owned copy of Halo MCC for Workshop access in order to download MCC custom maps (as well as shared bitmaps.map and sounds.map resources), or they can use Nexus Mods.

GREAT, SO HOW DOES IT WORK?

MCC custom maps have their own mcc_maps folder and separate MCC SINGLEPLAYER and MCC MULTIPLAYER menu categories. This keeps them separate from Xbox maps and Custom Edition maps, including maps that share the same filename.

Supported maps are self-contained modern Halo 1 MCC version-13 caches. Older chunk-compressed Anniversary maps, shared external resources, other Halo games, Workshop downloading and automatic campaign-package progression are outside of the scope of this simple addition.

The implementation keeps MCC-specific loading, conversion and compatibility logic in dedicated modules. Small, additive connections to shared engine entry points select these modules when an MCC map is active. Existing Xbox and Custom Edition loading paths remain in place. Engine connections select the MCC modules only for MCC custom maps. They do not load, execute or "spin up" otherwise.

This separation matters because MCC uses different resource formats, scripting capabilities and rendering conventions. Handling those differences within MCC-owned code reduces the risk of changing established Xbox or Custom Edition behavior, makes problems easier to isolate, and helps maintainers review or extend MCC support independently. The implementation still uses OpenCE’s common engine services rather than creating a second game engine.

WHAT DOES THIS INCLUDE?

  • Conversion of supported MCC geometry, textures, shaders and audio, including BC7 textures and MCC-specific sound compatibility.

  • HUD and controller-glyph scaling, plus Xbox-style pause menus with context-appropriate checkpoint, restart, quit and team-selection actions.

  • MCC scripting extensions, including parameterized scripts and support for the format’s 32,767-node syntax capacity, without raising the existing Xbox/Custom Edition limit.

  • Compatibility handling for mcc_mission_segment, as legacy Halo Xbox & the Gearbox port does not have this syntax implemented. If we didn't account for this, the game would assert.

  • MCC-specific checkpoint identities and support for up to four grenade types, including additional inventory synchronization.

  • Support for MCC campaign scripting, local-player and host-authority queries, optional-argument sleep_forever, position-distance queries, gravity controls and team navigation markers. MCC campaigns can also control dialogue gain and infinite ammunition, with the original settings restored when leaving the map.

  • Support for larger texture requirements in MCC custom maps, as well as MCC maps that have model parts & textures explicitly marked as having no material without throwing an assert. This has been done without raising the existing Xbox/Custom Edition limit, as the specific engine hooks used for MCC custom map compatibility only call when an MCC custom map is loaded.

  • Skull-status queries: Skull-status queries return a read-only disabled state. This allows compatible scripts to load without claiming to implement those skulls’ gameplay.

WHAT ABOUT NETWORKING AND NETCODE?

Networking uses OpenCE’s existing netcode and network co-op system. MCC custom maps participate in its host-controlled game sessions, with dedicated extensions where MCC requires additional state. Players need matching map data, the same as the Custom Edition map support implementation. This does not provide interoperability with the official MCC client or its matchmaking. Multiplayer and campaign co-op use OpenCE's existing host-authoritative netcode.

MCC custom maps support more than 2 grenade types, as well as custom campaign scripting states, which the Xbox engine does not support as there's simply no function or syntax for it. This also applies to to the netcode. I have solved this issue but this will increase the netcode compatibility version from 25 to 27 because each client on the network needs to understand those messages, campaign scripting states, as well as the extra grenade action values. It goes without saying that MCC clients and matchmaking are not supported.

DOES THIS SUPPORT EVERY MCC CUSTOM MAP?

Support remains experimental rather than a guarantee that every MCC custom map will work. Automatic progression through MCC custom map campaign packages has not been tested or implemented. The goal of this was to be a simple compatibility layer that can run natively in the Xbox engine. Campaign maps are currently selected as individual scenarios, and unsupported formats or features may still prevent a map from loading and additionally throw an assert.

Extract the MCC implementation, tests, inspection tools and documentation
from GulchCE main 7877f5b onto OpenCE
9da2a45. Keep OpenCE branding, updater,
release workflow and existing Custom Edition implementation intact.

MCC uses its own catalog, resources, converters, script extensions and
save state, with additive dispatch into the native engine. Include focused
asset-free CI, generated menu strings and the unchanged licensed bcdec
library. Carry the decoder notice in release archives and Android assets.

Raise the shared network compatibility version to 26 because MCC adds an
inventory message and extra grenade action values. Existing Xbox/CE packet
layouts are retained; every peer must run a matching protocol version.

Validation: Windows x86 Release build; 647 synthetic/regression checks;
154 fixture-enabled checks with three unavailable-fixture skips; source
isolation, generated-menu and dependency-checksum audits; packaging checks.
Android rebuild unavailable locally (no NDK), Linux unavailable (no WSL).
Previous precursor platform CI is documented separately from this branch.

Prepared locally for review; not pushed or submitted upstream.
…on#241)

Bring the tested MCC-only fixes from the fork into the contribution:
Vorbis window transitions, separate bitmap/sound resource readers,
campaign script operations, larger textures and materialless model parts.
Keep campaign state in MCC checkpoints and host-controlled snapshots.

Advance the contribution's network version from 26 to 27 for campaign
message 84. All peers require matching builds. Xbox and Custom Edition
loaders and function/global tables remain unchanged; shared source hooks
are additive and MCC-scoped.

Resolve the protocol-version conflict, correct the upstream installation
documentation, and add resource/campaign tests to the MCC validation jobs.
Keep the existing updater and release workflow unchanged.

The combined contribution passes 738 tests (6 optional-fixture skips) and
the Windows x86 release build. Targeted rendered loads of Solar Flare m0,
Combat Revolved b40 and Spasm pass, as do native checkpoint/core restore,
MCC-to-Xbox-to-CE transitions and two-instance loopback co-op state checks.
Development-build validation covered all 16 supplied maps and 247 sound
permutations against a reference decoder. Full campaign playthroughs and
Linux/Android builds of this update remain unverified.

(cherry picked from commit b14d172)
…yEdition#241)

Route H1A core_save_name to the MCC segment handler without changing Xbox or Custom Edition code. Add regression coverage and correct the earlier false-positive startup reports. On this contribution branch, the suite passed 746 tests with 6 skips; the Windows x86 release build and a 45-second B40 startup with delayed script output and opening dialogue passed.

(cherry picked from commit 47b263f)
…tyEdition#241)

Normalize unsupported recorded weapon slots to NONE in MCC-owned tag data before playback. Validate both stream codecs without changing Xbox or Custom Edition loaders, unit control, inventory limits or the network protocol.

Reproduced the M1 assertions using build 32's pilot recording. The fixed Windows x86 build passed the same trigger and a 270-second run invoking all five recordings. Audited 377 supplied recordings; 821 tests passed with six optional skips. Android target unavailable locally. No full campaign playthrough claimed.

(cherry picked from commit 4062c3e)
@HiIAmMoot

Copy link
Copy Markdown

Great work. Do note though, there are many maps that do use of shared maps lile bitmaps.map even in MCC.

@chestahh

Copy link
Copy Markdown
Author

Great work. Do note though, there are many maps that do use of shared maps lile bitmaps.map even in MCC.

You're right, and I'm glad you pointed that out, I started noticing that with other MCC custom maps that I was testing - every day is a school day!

…tyEdition#241)

Support the reported MCC integer, conditional-print and sound-prediction
functions, scenario-local developer_mode, and objects_distance_to_flag.
Preserve MCC edge-center HUD anchors and normalize only terminal drawing.

Refuse every MCC object-name list above the native 512-name capacity
instead of truncating script targets. B30 Evolved still needs an MCC-owned
name-table/checkpoint/co-op extension and is documented as not playable.

Existing Xbox/CE loader code and constants are unchanged. Shared source
changes are additive MCC-only drawing dispatches.

Validation: Windows x86 release; 876 tests passed, six optional skips;
Precipice and Combat Revolved B30 70-second simulation checks; rendered
HUD/console inspection; MCC/Xbox/CE/MCC transition simulation. Android
could not build because this local configuration has no Android target.

(cherry picked from commit dc2c498)
…tyEdition#241)

Use an owned platform directory handle for the MCC catalog so it cannot replace the shared iterator used by startup cleanup. Preserve map filtering, sorting and namespace isolation; add directory and handle-lifetime regression coverage.

(cherry picked from commit 1d44658)
@cybersecurity

Copy link
Copy Markdown
Collaborator

Very cool stuff. Im going to close this for now, but once the ability to auto download maps from the host has been added, im going to start looking into this again. Also, I must say, this is a VERY large PR in terms of lines of code changed. Ideally we would want it trimmed down to 5k or 10k lines. Thanks again.

@chestahh

Copy link
Copy Markdown
Author

No worries Pablo - thank you for taking a look at it regardless. In the meantime I'll work on optimising the code and trimming the fat where I can, and once auto-downloading is in the main repo I'll open another PR.

@chestahh
chestahh deleted the codex/opence-mcc-review branch October 10, 2026 23:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants