# Intro skip (`intro-skip`, GAMEPLAY) `mods/introskip/IntroSkipMod` – groove.exe patches only, no data changes. | Option | Default | Patch | |---|---|---| | `logos` – skip startup logos | on | 0x41D56E `68 28 25` → `53 EB 62` | | `demo` – disable attract demo | on | 0x549DC0 `76 41` → `EB 41` | | `story` – skip story movies | off | 0x54AEC9 / 0x54B138 / 0x54B26F `E8 …` (call FUN_0041f630) → 5×`90` | ## Startup sequence (WinMain FUN_0041d350) After DirectDraw/DirectInput/sound init and the (empty) `In` slide show (FUN_0043cb40(1)): ``` FUN_0041f630("disneylogompeg.dat") ; movies/, DirectShow; any key skips if DAT_005865e4 (movie failed): ; set to 1 at playback start, 0 on end/skip show disney.cor 3 s, arglogo.cor 3 s, movinfo.cor 8 s ; FUN_0041d2c0(name, ms), key skips else FUN_0041f630("argologompeg.dat") show Englogo.cor 3 s ; title screen "Ein Königreich für ein Lama" call FUN_00545030 ... ; 0x41D5D3, game init continues -> main menu ``` The logo patch replaces `push offset "disneylogompeg.dat"` by `push ebx; jmp 0x41D5D3`. The extra `push ebx` is needed: the skipped block leaves one dword (`push ebx` at 0x41D554) and the englogo call's two arguments are cleaned together with a later `push 2Ch` by `add esp,0Ch` at 0x41D5E4. ## Attract demo Main menu frame function 0x549C50 (state 2, table 0x578F28): if `frame(0x584650) − lastInput(0x5863F4) > 0x708` (1800 frames) it sets the next mode 0x584700 = 4; 0x549E66 then switches to game state 4 and loads one of three demos round robin from table 0x578EF8 (16 bytes each: map, tribe, world, chapter; index 0x6D9BF8). Demo input files are `wads/*.DEM` (u32 frames + 8 bytes per frame, FUN_004255b0). This is the only place that starts a demo, so turning the `jbe` into `jmp` disables it completely. ## Story movies `movies/%d%d%dINTRO.DAT` before a chapter (FUN_0054ae20, not in demo mode), `EULOGY.DAT` (0x54B138) and `%d%d%dOUTRO.DAT` after a world (0x54B26F) all go through FUN_0041f630; the callers clean the stack, so NOPing the call is safe. `CREDITS.dat` (0x54A5F1) is left alone. ## Level fly-by – not implemented The letterbox fly-over at level start is driven by camera strats (strat VM), not by engine code; the engine has no "skip cut scene" flag to set. Return skips it in game. Left out on purpose. ## Measured (Wine 6, llvmpipe, Xvfb, loaded machine) | | main menu after launch | attract demo | |---|---|---| | original | 31.5 s (title screen 23.4–31.5 s) | starts after ~34 s idle | | logos + demo | 22.3 s | none within 110 s | Under Wine the MPEG logo movies render black, so most of the saving is the title screen and the movie attempts. Screenshot: `img/mods/introskip_menu.jpg`.