Files
llamamod/notes/mod-boottolevel.md
T

2.6 KiB
Raw Blame History

Boot to level (boot-to-level, GAMEPLAY)

mods/boottolevel/BootToLevelMod – starts the game directly in one level: no logos, no menus, no world map. Used by the level editor's Play button (details, offsets and tests: editor-playtest.md).

Option Default
world / chapter 1 / 1 level to load (world 9 = TestLevel, chapters 1–49)
slot 3 save slot the game plays with (new game if empty)
logos on skip logo movies and title screen (skipped if intro-skip already patched them)
quitOnEscape off Escape (pause) ends the game at once through the normal exit path
start empty "x, y, z[, yaw][ @ world/chapter]" in cells: moves the level's player start (WAD rebuild)

Start bound to a level (2026-11-07): a start with "@ world/chapter" (BootToLevelMod.formatStart(world, chapter, …)) is used only while world/chapter name that level; for any other level it is ignored with a progress note ("Player start ignored: it was set for world W chapter C") instead of failing with "no collision floor" (a play-test whose restore never ran left its start in config.json, and every later apply for another level failed). A start without "@" applies to whatever level is chosen (old configs, hand-typed values) and is still checked strictly. Tests: BootToLevelModTest.startOfAnotherLevelIsIgnored, parsesStartLevel. The editor's play-test (PlaytestRunner.install) should write the bound form – see the report.

Start camera along (StartOverride.apply): the llama's chain moves and turns with the start when it is a levelbuild/editor start camera – one node within 2.5 cells (PlayerStart, levelbuild since 2026-11-07) or the older "node 8 behind + nodes on the llama" chain; original chains stay. Test: BootToLevelModTest.singleCameraNodeMovesWithTheStart. In game (apptest 2026-11-07, test world, start=21, 0.1, 15, 90, i.e. moved and turned from the plaza start 18/14.6 yaw 0): camera behind the llama, facing the stairs (img/editor/bootstart_testworld_camera.jpg).

Patches: jmp at 0x549C50 (main-menu frame handler) → once: read slots (FUN_0041c0e0), load slot (FUN_0041cc70), set tribe/world/chapter/map 0x584EB4…, music shutdown, state 0x5846E4 = 3, return 1. quitOnEscape: jmp at 0x549F40 (in-game frame handler): pause bit 0x8 of 0x5FCF08 → state 0x11 (the main menu's "Beenden"), return 1. Data: one 4-byte allocateData flag. Registered via ServiceLoader (META-INF/services/com.eliasmueller.llamamod.mods.Mod).

Verified on display :9: Village 2 and TestLevel 2 load within seconds of the window; Escape ends groove.exe in ~1.3 s without errors.