MJOLNIR CLI changelog
MJOLNIR CLIv0.3.0

Classic maps, game types, and every object in play

Convert classic Halo CE maps and package them for the hub, write the multiplayer game types the simulation runs, and list every object in the running game with live objects.

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-bsp builds a BSP holding only the CE map, with its own Havok collision, so nothing of the host mission's geometry is used.
  • level bake --standalone gained the pieces a map of its own needs. --bsp INDEX=PAYLOAD gives the map its own structure BSP, --world ships its own Unreal world under the map's codename, --world-object points it at a shipped world instead, and --write-tag keeps the baked scenario for mjolnir tag-file.
  • mjolnir level register rebuilds 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 V packages a converted map as a signed .mjolnir map pack for the hub, and mjolnir map runtime packages the CE runtime pack every map depends on. --sign signs with this machine's device key.
  • mjolnir megalo write --mode slayer|ctf --out x.mglo writes 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 read prints 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, and mjolnir now 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 status also names the simulation thread and says how many objects are in play.
  • mjolnir compile writes each node's source offset, and decompiling turns a cond back into a cond.

Fixed

  • mjolnir compile resolves 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

  • live is 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.