57 lines
2.7 KiB
Markdown
57 lines
2.7 KiB
Markdown
# 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`.
|