This release carries the tooling behind the classic multiplayer maps: what turns a Halo CE map into one the game loads, what packages it for the hub, and the game types it is played under.
Added
mjolnir level collision <collision_N.json> --out <bsp>converts a classic CE collision BSP (halo2ue's export) into a structure BSP the simulation walks on, and writes the transform that places everything else on it.--own-bspbuilds a BSP holding only the CE map, with its own Havok collision, so nothing of the host mission's geometry is used.level bake --standalonegained the pieces a map of its own needs.--bsp INDEX=PAYLOADgives the map its own structure BSP,--worldships its own Unreal world under the map's codename,--world-objectpoints it at a shipped world instead, and--write-tagkeeps the baked scenario formjolnir tag-file.mjolnir level registerrebuilds the registration container and the multiplayer menu's map list from every installed map. The launcher runs it after a map is installed or removed.mjolnir map pack <dir> --code XYZ --version Vpackages a converted map as a signed.mjolnirmap pack for the hub, andmjolnir map runtimepackages the CE runtime pack every map depends on.--signsigns with this machine's device key.mjolnir megalo write --mode slayer|ctf --out x.mglowrites a multiplayer game type the simulation's own Megalo interpreter runs: Slayer, and Capture the Flag with Halo CE's rules, with CE health packs. It takes the score to win, the number of rounds, and the base options a host can change:--time-limit(the round ends when it runs out), lives, respawn and suicide times, what the map may place, and player and respawn traits (--trait shields=1).mjolnir megalo readprints what a variant holds.mjolnir live objects [--group bipd] [--filter text] [--tsv out]: every object in play. Each row has its handle, its type (biped, weapon, equipment…), its definition tag, its position, its body and shield as a percentage of the maximum, and its parent if it is attached. The row for the unit a player controls is marked with that player. The simulation keeps its objects, players, AI and script state in named tables in its thread-local storage, andmjolnirnow finds them there. Each table names itself, so nothing is read at an address one build hard-codes.mjolnir live players: each player, the unit it controls, and where that unit is.mjolnir live arrays: all 59 of the simulation's per-game tables, with how full each one is. It needs no build profile.mjolnir live statusalso names the simulation thread and says how many objects are in play.mjolnir compilewrites each node's source offset, and decompiling turns acondback into acond.
Fixed
mjolnir compileresolves name literals (objects, trigger volumes, squads, flags and the rest) against the scenario it compiles for. Every one pointed at the first element of its block.- Compiled scripts keep the 0x1000-byte reserve at the end of the script string data that the engine expects.
Known limits
liveis read only. Positions and vitality can be read but not yet written.- An attached object's position is relative to its parent.
- The layout inside an object was measured on the current Steam build (CU4). A game update that moves it is caught by a consistency check, and the command stops instead of printing wrong values.