# *.mnu

These files appear to be the UI definitions for Chaos Gate. Some relate to
system menus, other to in-game menus. Their names are hardcoded into the
`WH40K.exe` binary. Each has a `.obj` file associated with it.

It's an ASCII-formatted text file with a 12-line header, followed by a number
of descriptor records.

Here's the top of `MainGame.mnu`:

```
MainGame.obj
BACKGROUND COLOR 0..255..-1 trans : 0
HYPERTEXT COLOR 0..255            : 120
FONT TYPE 0..5                    : 10
wh40k_12
basfnt12
wh40k_47
wh40k_12_red
wh40k_12_blue
wh40k_12_green
wh40k_12_yellow
NULL
```

The first line of the header is a `.obj` file containing sprites we want to
display on-screen. We see entries further down have a `SPRITEID`, which must
reference entries in that file.

In `SaveGame.mnu`, we can see multiple `.obj` files can be referenced.

There are then 3 lines that seem to be fixed descriptor names with values
that vary. Is this font colour, perhaps? Unsure.

Next is a variable-length list of font names, referencing files in the `Fonts`
directory.

Finally, there's a list of records that specify the menu itself. Truncated
contents of `SaveGame.mnu`:

```
#rem..........Background
MENUID     : 1
MENUTYPE   : 0
MOVEABLE   : 0
ACTIVE     : 1
SPRITEID   : 0
ACCELERATOR: 0
DRAW TYPE  : 0
SHARE      : -1
X-CORD     : -1
Y-CORD     : -1
DESC       :
*
#rem..........MAIN BACKGROUND
MENUID     : 2
MENUTYPE   : 45
MOVEABLE   : 0
ACTIVE     : 1
SPRITEID   : 0
ACCELERATOR: 0
DRAW TYPE  : 0
SHARE      : -1
X-CORD     : -1
Y-CORD     : -1
DESC       :
#rem.......... MAIN BACKGROUND
        SUBMENUID  : 1
        SUBMENUTYPE: 31
        FONTTYPE   : 20
        ACTIVE     : 0
        SPRITEID   : -1
        ACCELERATOR: 0
        DRAW TYPE  : 0
        SHARE      : 0
        SOUNDTYPE  : 0
        DESC       :
*
#rem..........Chat List Box Menu
MENUID     : 21
MENUTYPE   : 1
MOVEABLE   : 0
ACTIVE     : 1
SPRITEID   : 764
ACCELERATOR: 0
DRAW TYPE  : 0
SHARE      : -1
X-CORD     : -1
Y-CORD     : -1
DESC       :
[...]
*
~
```

We start processing these as soon as we see `MENUID`, I suppose. Each toplevel
item is `*`-delimited, and the list is terminated with `~`.

Each menu has a list of parameters:

| Name    | Examples | Purpose |
|---------|----------|---------|
| `MENUID`|  `1`, `2`, `3` | Maybe linking between menus? |
| `MENUTYPE` | `0`, `1`, `2`, `3`, `45`, `300` | ? |
| `MOVEABLE` | `0` | Unimplemented functionality? |
| `ACTIVE` | `0`, `1`, `1,0` | ? |
| `SPRITEID` | `-1`, `0`, `123`, `16,-1,1` | Select from `.obj` file? |
| `ACCELERATOR` | | ? |
| `DRAW TYPE` | | ? |
| `SHARE` | | ? |
| `X-CORD` | `-1`, `0`, `200` | X coordinate to draw at |
| `Y-CORD` | `-1`, `0`, `200` | Y coordinate to draw at |
| `FONTTYPE` | | Choose a font from the above? |
| `SOUNDTYPE` | | ? |
| `DESC` | `CHARACTER SELECT`, `51005` | Text, or reference to `Data/USEng.dta` |

Submenus also show a couple of unique values:

| Name          | Examples      | Purpose       |
|---------------|---------------|---------------|
| `SUBMENUID`   | `1`, `2`, `3` | As `MENUID`   |
| `SUBMENUTYPE` | `0`, `1`, `2` | As `MENUTYPE` |

It seems .mnu files can also include other files, which have the extension
`.mni` (presumably for "Menu include"). Examples:

```
*
$GenDialog.mni
$GenLoad.mni
```

It looks like we just interpolate the named file into the text when we come
across one of these lines.

## (Sub)menu types

The types seem to refer to different types of UI widget. Here's a list of unique
values:


| Value | Meaning |
|-------|---------|
| 0 | Background |
| 1 | Logical menu grouping? |
| 2 | ? |
| 3 | Standard button? |
| 30 | Equipment? |
| 31 | "Character helmet" / "Slot" |
| 40 | "X Line Y" |
| 41 | "X Line Y" |
| 45 | ? |
| 45,10,11,9 | ? |
| 45,11,12,10 | ? |
| 45,14,15,13 | ? |
| 45,17,18,16 | ? |
| 45,3,4,2 | ? |
| 45,5,6,4 | ? |
| 45,6,7,5 | ? |
| 45,7,8,6 | ? |
| 45,8,9,7 | ? |
| 45,9,10,8 | ? |
| 50 | ? |
| 60 | Other text to display? (`UltEquip.mnu`) |
| 61 | Text to display |
| 70 | Hypertext to display |
| 91 | ? |
| 100 | ? |
| 110 | ? |
| 120 | ? |
| 200 | Drop-down button? |
| 205 | Single list box item? |
| 220 | Psyker power? |
| 221 | Page? |
| 228 | Big buttons in `Main.mnu` |
| 232 | ? |
| 233 | ? |
| 300 | Pop-up dialog box |
| 400,0,0,{8, 16} | ? |
| 400,22,22,{2, 4, 5, 6, 7, 8, 9, 9, 10, 13, 16} | ? |
| 400,30,-1,5 | ? |
| 405,0,0,{8, 16} | ? |
| 405,22,22,{2, 4, 5, 6, 7, 8, 9, 10, 13, 16} | ? |
| 405,30,-1,5 | ? |

## Positioning

The X-CORD and Y-CORD values would seem to be related, to this, but they are
universally set to 0 or -1.

Far more important are the XOffset and YOffset values for each sprite in the
associated .obj files. Taking these into account is enough to draw `Options.mnu`
successfully, for instance:

![](img/Options.mnu.png)

## Animation

This seems to be done by choosing a different sprite to draw every N ticks. They
are laid out sequentially, but I don't yet know how to animate them. It's likely
to be the same approach as used for other obj files.

