# Game files What is on the CD and on the hard disk, how files are named, and the small formats around the levels. The level files themselves are described in [WAD container](wad.md). ## Two folders: HD and CD The installer copies a small **HD** part to the hard disk; everything big stays on the **CD**. The game looks up each file in `HDPath\dir\file`, then in `CDPath\dir\file`, then on every CD drive (`FUN_00415690`). A plain folder in `CDPath` is enough – no real CD drive is needed. LlamaMod relies on this: it points `CDPath` at its own `cd-active` folder, where mod outputs replace original files ([notes/llamamod-app.md](../../notes/llamamod-app.md#registry-cd-path-and-the-exe-patch)). | Folder | Contents | |---|---| | HD (`Setup//Hd` on the CD) | `groove.exe`, `aal.dll`, `aleax2.3dl`, the audio codecs `asfcodec.adl` and `Vagcodec.adl`, `music/english.cvs` (speech), save games `king0.ksv`…`king2.ksv` | | CD (`Setup//Cd`) | `wads/` level files, `music/*.asf` music, `movies/*.dat` videos, `*.cor` pictures, `test9.tle`, empty folders `gallery/`, `in/`, `out/` | Registry key (all values): `HKEY_LOCAL_MACHINE\Software\Disney Interactive\Emperors New Groove\1.0` with `CDPath`, `HDPath`, screen size, volumes and devices. LlamaMod's base patch of `groove.exe` redirects it to `HKEY_CURRENT_USER`, so no admin rights are needed. Development used the **German CD**. The English first release is supported as well: all exe patches find their places in both builds (table below). Its own CD data has not been tested yet – the formats are expected to be the same. ### groove.exe versions | Build | PE date | Size | Notes | |---|---|---|---| | German | 2001-02-12 | 1,642,496 bytes | reference for all addresses in these pages | | English (first release, menu "Start Game") | 2000-10-17 | 1,634,304 bytes | same code, shifted (e.g. main menu frame handler 0x549990 instead of 0x549C50); .data globals laid out differently (game state 0x583D74 instead of 0x5846E4, player strat 0x6D94A4 instead of 0x6D9E1C); .data 0xD000 bytes in the file instead of 0xE000 | LlamaMod supports both (`exe/Site` lists every address it uses in both builds). Addresses in the reference pages are those of the German build. ## Level naming scheme Levels are named **`tlm`** (tribe is always 1 in the game): | World | Name | Files | Notes | |---|---|---|---| | 1 | Village | t1l1m001–004 | `t1l1m001` is the default base level for new levels | | 2 | Jungle at Night | t1l2m001–003 | t1l2m003 is the llama chase (player strat `LlamaChase`) | | 3 | River | t1l3m001–004 | player strat `KuscoAndPachaTogetherOnATree` | | 4 | Jungle by Day | t1l4m001–003 | t1l4m002 has the Alligator (used by the arena) | | 5 | Mountain | t1l5m001–003 | | | 6 | City | t1l6m001–003 | | | 7 | Catacombs | t1l7m001–005 | m001/3/5 are roller-coaster rides (player strat `RollerCoaster`) | | 8 | Lab | t1l8m001–006 | | | 9 | TestLevel | none on the CD | 49 chapter slots, see [TestLevel](testlevel.md) | Other WADs: `t0i0m000` (front end), `t0i0m998` / `t0i0m999` (outro and game-over backdrops), `t6l6m001/002` (memory-card/options screens – *likely*), `FESOUND.WAD` (front-end sound bank, not a chunk file). The chapter counts the world map uses are a table in `groove.exe` (0x572420): 4, 3, 4, 3, 3, 3, 5, 5, 49 – world 8 has one more file than its table entry (*unknown* why). ## Pictures (COR) | File | Use | |---|---| | `T1.COR` | loading picture of world *w*, chapter *c* (`T191.COR` … `T1949.COR` for TestLevel) | | `.cor` | concept art shown with a chapter (*likely*) | | `tally.cor`, `gameover.cor`, `loading.cor`, logos | screens; `gameovertest.cor` is unused | Format (*certain*, [`tools/cor2png.py`](../../tools/cor2png.py)): 8-byte signature `17 98 AF 89 FE 42 D1 12`, u32 version 1, u32 unpacked size, u32 packed size, then LZ data: a byte `n < 0x80` = *n* literal bytes follow; `1LLLoooo oooooooo` = copy L+3 bytes from *o* bytes back. The result is 640×480 RGB (a few greyscale ones). [`tools/png2cor.py`](../../tools/png2cor.py) and [`CorEncoder.java`](../../src/main/java/com/eliasmueller/llamamod/format/CorEncoder.java) write it; LlamaMod uses that for the loading pictures of new levels. ## Movies and demos * `movies/intro.dat` / `…outro.dat` and the logo movies: MPEG-1 video 320×240, 29.97 fps, MP2 audio, played through DirectShow. The Intro skip mod patches the calls that start them ([notes/mod-introskip.md](../../notes/mod-introskip.md)). * `wads/*.DEM`: recorded attract-mode demos, u32 frame count + 8 bytes of input per frame (*likely*; not used by LlamaMod). ## Save games (KSV) `king0.ksv`…`king2.ksv` in the game folder, 256 bytes each. Decoded from the load/save functions `FUN_0041c640` / `FUN_0041c820`; code: [`save/Ksv.java`](../../src/main/java/com/eliasmueller/llamamod/save/Ksv.java). | Offset | Meaning | |---|---| | 0x00 | used flag (0 = empty) | | 0x01 / 0x02 | lives / energy | | 0x03–0x06 | world-map cursor: tribe, world, chapter, map | | 0x07 | number of gold coins | | 0x08–0x3D | u8 [9][6] chapter flags (bit 0 collectible found, bit 1 all coins = gold coin) | | 0x3E–0x41 | last played tribe, world, chapter, map | | 0x42 / 0x43 | highest unlocked world / chapter | | 0x44–0xAF | u16 [9][6] coins per chapter | | 0xB0–0xCF | unknown | | 0xD0–0xD9 | options (effects and music volume, speaker mode, …) | To start a TestLevel chapter without a mod, set the cursor, the last played and the highest unlocked world/chapter to 9 and the chapter. LlamaMod does this with `llamamod --unlock 9 --cursor` and with the *Save games* tab. ## Hidden debug features Strings and code in `groove.exe` point to leftovers of the developers' tools. They were seen in the binary but **not** verified or used by LlamaMod: F6 writes a screenshot `capture.tga`, the command-line switch `-display_diagnostics` writes a `.dispdiag` file, a log `c:\kingdom_dbg.txt`, and an unused slide-show player that reads the empty `in`/`out` folders. The *Built-in cheats* mod uses the game's own cheat codes ([notes/mod-cheats.md](../../notes/mod-cheats.md)).