Multiplayer investigation
Halo Campaign Evolved ships four-player campaign co-op and a large amount of dormant competitive multiplayer machinery. The goal was a minimal red-versus-blue CTF session in an existing campaign world, then a custom world once the runtime path is known. Update 2026-10-21: overtaken. Slayer and CTF run on converted classic maps with their own worlds and structure BSPs. The simulation's engine switch shipped in mods-v0.7.0 (PR #106), and the Slayer and CTF variant files ship in every mods release since mods-v0.9.0.
Current verdict
No hidden multiplayer world package was found.
The competitive rules, object definitions, messages, and simulation code remain, but this build does not expose a named multiplayer map in either content index.
132,091
unique IoStore paths
14,240
umap chunks
77
named non-generated maps
0
classic CE map names
Packed-content inventory
- All Halo world packages are under Levels/Halo1/Solo; there is no Multi branch.
- Eleven apparent CTF or KOTH map hits were random World Partition cell IDs.
- No Blood Gulch, Beaver Creek, Sidewinder, or other classic CE map name is indexed.
- The 27 companion pak files contain 200,029 entries, primarily Wwise audio and resources, with no map or asset package entries.
- The IoStore containers are indexed, Oodle-compressed UE5.5 containers and are not encrypted.
Root world package paths
- /Game/Levels/Halo1/Solo/A15/A15
- /Game/Levels/Halo1/Solo/A30/A30
- /Game/Levels/Halo1/Solo/A50/A50
- /Game/Levels/Halo1/Solo/B30/B30
- /Game/Levels/Halo1/Solo/B40/B40
- /Game/Levels/Halo1/Solo/C10/C10
- /Game/Levels/Halo1/Solo/C20/C20
- /Game/Levels/Halo1/Solo/C45/C45
- /Game/Levels/Halo1/Solo/D20/D20
- /Game/Levels/Halo1/Solo/D40/D40
- /Game/Levels/Halo1/Solo/Extra/E10/E10
- /Game/Levels/Halo1/Solo/Extra/E20/E20
- /Game/Levels/Halo1/Solo/Extra/E30/E30
What remains
Packaged support assets
713 indexed paths sit under explicit multiplayer directories. They include multiplayer globals, object types, team names, messages, respawn audio, map overrides, loadouts, Megalo, Sandbox, the Oddball weapon, and assault-bomb assets.
Simulation rules
The native simulation module contains CTF, Slayer, Oddball, King of the Hill, Infection, Juggernaut, Assault, Territories, Forge, team, respawn, and loadout identifiers. Presence does not yet prove that the shipping UE5 layer can activate them.
Update 2026-10-21: the Megalo engine now starts for converted maps (native/map_registry, mods-v0.7.0), and Slayer and CTF ship as variant files since mods-v0.9.0. No other mode ships a variant file.
Live runtime result
UE4SS found a live BlamEngineGlueOuterSubsystemImpl and four campaign variant objects. With A30 loaded, the campaign-flow subsystem owned one variant while three remained transient. The world scan found the A30 root world plus 90 World Partition cell worlds.
The exposed variant classes are BlamGameEngineBaseVariant and BlamGameEngineCampaignVariant. The previously suspected BlamGameEngineVariant path is not an exposed runtime class. Reflected APIs include social options, campaign flags, per-player traits, team ally/enemy/friendly/traitor tests, Blam player-index resolution, network co-op detection, session readiness, replicated session-running state, and endpoint IDs.
Fourteen high-level session, lobby, and travel hooks registered but produced no callbacks during the captured interval. This is an observation, not proof that the official flow bypasses them: tracing may have begun after an earlier transition. The next probe snapshots reflected variant and network-component state and traces endpoint assignment directly.
Solo transition baseline
A controlled frontend-to-A30 run with no second player captured SetActiveCampaign. Four campaign variants appeared and CurrentCampaign resolved to DA_FirstPlayableCampaign. Endpoint generation advanced from 0 to 1, but both endpoint IDs stayed 0, bSessionRunning stayed false, and lobby player count stayed 1. Endpoint generation alone therefore does not prove a network peer exists.
A second human tester is not currently available. The solo-versus-co-op differential, custom-travel session preservation, and competitive-mode activation remain unverified.
Update 2026-10-21: two of the three are settled. Competitive modes run: the simulation starts its Megalo engine for converted maps (mods-v0.7.0, PR #106). The session survives travel into a custom world: a joiner leaves its fireteam, joins the host's, and follows it into its map (mods/MJOLNIRLobby/Scripts/games.lua), and fireteams go past four players on separate PCs (PR #120), up to 16.
Shortest prototype route
Update 2026-10-21: superseded by the route that shipped: joins that go through the game's own join handler, as an accepted invite does (MJOLNIRLobby), converted maps with their own worlds and structure BSPs, and a patched constant in the simulation's load-map handler that starts the Megalo engine (see HaloSimulation_tag_release.dll). The plan is kept as written.
- 1. Reuse co-op transport. Host and join through the supported campaign session flow so PlayFab, Party, identity, and replication already work. Compare a real two-human capture against the recorded solo baseline.
- 2. Travel to a known campaign world. Test plain travel first, then the same path with a listen-server option. A15 is the smallest initial target: /Game/Levels/Halo1/Solo/A15/A15.
- 3. Activate a game variant. Discover the live base and campaign variant objects, then trace the shell startup structures that choose campaign versus CTF.
- 4. Supply map metadata. Campaign maps do not necessarily contain team spawns, flag stands, boundaries, or objective markers. Spawn these at runtime before treating the mode as playable.
Custom-map path
A custom map is a second-stage problem. The game can index unencrypted UE5.5 IoStore containers, and Retoc can produce pak, utoc, and ucas output. The unresolved constraint is cooking a compatible UE5.5 world with the game's custom versions, script imports, and required Blam components. A tiny travel-only test world should precede a full CTF arena.
Update 2026-10-21: solved. mjolnir level bake --standalone, with --world and --bsp, registers a map with a cooked world package of its own and its own structure BSPs, and MJOLNIRLevelLoader's native half resolves that world by name at load (native/map_registry). The converted classic maps ship this way (tools/level/convert_ce_map.sh).
Repository status
MJOLNIRMultiplayer now uses the verified CU2 root-world paths and dispatches plain or listen-server travel through the live player controller. It still does not create or advertise a session, and travel has not yet been verified in HCE.
Update 2026-10-21: superseded. MJOLNIRLobby hosts games on the game's own co-op fireteam and advertises them: a host can set a game to PUBLIC GAME, which lists it on the hub, and FIND GAMES joins it the way an accepted invite does (PR #127, mods-v0.11.0). A match's game type reaches every fireteam client through the host's travel into the map. MJOLNIRMultiplayer keeps the travel commands below, plus mjolnir_mission, mjolnir_debug_ui and mjolnir_kick; the scan, trace and dump commands are MJOLNIRDiscovery's.
mjolnir_maps
mjolnir_travel a15
mjolnir_listen a15
mjolnir_scan_blam
mjolnir_scan_worlds
mjolnir_trace_network
mjolnir_dump_stateWorking notes and reproduction history are rendered in full at Multiplayer investigation notes.