Files
llamamod/notes/mod-introskip.md
T

2.7 KiB
Raw Blame History

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.