<!DOCTYPE ARTICLE PUBLIC "-//OASIS//DTD DocBook V4.2//EN" [
<!ENTITY lowbar "_">
	<!ENTITY lsqb "[">
	<!ENTITY rsqb "]">
	<!ENTITY lcub "{">
	<!ENTITY rcub "}">
	<!ENTITY num "#">
	<!ENTITY bsol "\">
	<!ENTITY verbar "|">
	]><article>
<articleinfo>
<title>The unofficial LMP format description</title>
<author>
<firstname>Uwe</firstname><surname>Girlich</surname>
<affiliation><address><email>uwe@half-empty.de</email></address></affiliation>
</author>
<pubdate>v2.1.3, 3/12/1998</pubdate>
<abstract>
<para>This document describes the LMP file format. It is the result of ``recording''
a game in DOOM, DOOM &rsqb;&lsqb;, HERETIC, HEXEN and STRIFE.
This documentation covers all these games in all known versions.</para>
</abstract>
</articleinfo>
<sect1 ID="INTRO">
<title>Introduction</title>
<para>The LMP file format appears first with the game DOOM on December 10th, 1993 
and remains relatively unchanged in all its successors.</para>
<para>I explain in this document the different flavors of LMP files from:
<variablelist>
<varlistentry>
<term>DOOM</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>DOOM 0.99, 1.1, 1.2</para>
</listitem>
<listitem>
<para>DOOM 1.4beta</para>
</listitem>
<listitem>
<para>DOOM 1.5beta</para>
</listitem>
<listitem>
<para>DOOM 1.6beta, DOOM 1.666 </para>
</listitem>
<listitem>
<para>DOOM 1.7a</para>
</listitem>
<listitem>
<para>DOOM 1.8</para>
</listitem>
<listitem>
<para>DOOM 1.9</para>
</listitem>
<listitem>
<para>DOOM 1.10</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Ultimate DOOM</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>Ultimate DOOM 1.9</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>DOOM II</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>DOOM &rsqb;&lsqb; 1.666</para>
</listitem>
<listitem>
<para>DOOM &rsqb;&lsqb; 1.7, 1.7a</para>
</listitem>
<listitem>
<para>DOOM &rsqb;&lsqb; 1.8</para>
</listitem>
<listitem>
<para>DOOM &rsqb;&lsqb; 1.9</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>HERETIC</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>HERETIC 1.0, 1.2, 1.3</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>HEXEN</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>HEXEN beta</para>
</listitem>
<listitem>
<para>HEXEN 1.0</para>
</listitem>
<listitem>
<para>HEXEN 1.1</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>STRIFE</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>STRIFE 1.0, 1.1</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
</variablelist></para>
<para>The LMP files created with games which appear on one line are not
distinguishable.</para>
<para>To create a LMP file start the game with the command line switch
<literal REMAP="tt">-record foo</literal> (and <literal REMAP="tt">-warp</literal>, <literal REMAP="tt">-skill</literal> etc.) and play as
usual. If you press <literal REMAP="tt">q</literal> the record (and the game) stops. In old DOOM 
(&lt; 1.4), HERETIC and HEXEN this happens at the end of a level too.
You will find a file <literal REMAP="tt">foo.lmp</literal> in the current directory. To play it back
start the game with the command line switch <literal REMAP="tt">-playdemo foo</literal>.</para>
<para>A LMP file records all player actions. The monster movements, respawn
positions etc. are totally deterministic. The messages during a multiplayer
game (chat mode) do not appear in the LMP.</para>
<para>It's a pity but the conversations in STRIFE, which form an important 
part of the game aren't recorded. You can only record sequences 
<emphasis>without</emphasis> these talks. In fact only the conversation start action
will be recorded. If you play a LMP back, you can now choose the answers for
yourself (and hope that the original player used the same answers).</para>
<para>A LMP file consists of a header, a data area and a quit byte.

<itemizedlist>
<listitem>
<para>The header contains the skill, episode, start map, number of players etc.</para>
</listitem>
<listitem>
<para>The data area is divided in game tics. For each player there are

<itemizedlist>
<listitem>
<para>4 (DOOM and DOOM &rsqb;&lsqb;) or</para>
</listitem>
<listitem>
<para>6 (HERETIC, HEXEN and STRIFE) </para>
</listitem>
</itemizedlist>

movement bytes per game tic.</para>
</listitem>
<listitem>
<para>Each LMP should end with a quit byte (0x80).</para>
</listitem>
</itemizedlist>

The duration of a gametic is round 1/35s. With time measurements with
4dos:

<screen>timer ^ doom -playdemo name ^ timer</screen>

of many different LMP's and linear curve fitting I found the slightly different
frequency 35.003Hz.
So it is not wrong to speak of 35Hz but it is not totally correct.</para>
</sect1>
<sect1>
<title>Header</title>
<para>The easiest way to check the length of the header is to start the games with 
the <literal REMAP="tt">-record</literal> option. Then you have to press ``<literal REMAP="tt">q</literal>'' during the
startup sequence. 
In the moment, when the screen switches from text mode to graphics mode,
the game stops and you receive the shortest LMP file. It consists only of 
the header and the quit game byte.</para>
<para>The LMP header format is a subject of change.</para>
<sect2>
<title>Old DOOM, HERETIC</title>
<para>

<table>
<title>7 byte Header of old DOOM up to 1.2 and HERETIC.</title>
<tgroup COLS="4">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>address </entry>
<entry>type </entry>
<entry>contents </entry>
<entry>range</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0000</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>skill </entry>
<entry>0-4</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0001</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>episode </entry>
<entry>1-3/4</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0002</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>map </entry>
<entry>1-9</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0003</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>green/green player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0004</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>indigo/yellow player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0005</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>brown/red player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0006</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>red/blue player </entry>
<entry>0: inactive, 1: active</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
</sect2>
<sect2>
<title>New DOOM, DOOM &rsqb;&lsqb;</title>
<para>

<table>
<title>From DOOM 1.4 on and in DOOM &rsqb;&lsqb; the header consists of 13
bytes.</title>
<tgroup COLS="4">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>address </entry>
<entry>type </entry>
<entry>contents </entry>
<entry> range</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0000</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>version </entry>
<entry>look in the table below</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0001</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>skill </entry>
<entry>0-4</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0002</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>episode </entry>
<entry>1-4</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0003</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>map </entry>
<entry>1-32</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0004</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>multiplayer rule </entry>
<entry>0: Cooperative, 1: DeathMatch, 2: AltDeath</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0005</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>respawn </entry>
<entry>0: off, !=0: on, <literal REMAP="tt">argv</literal> - number of <literal REMAP="tt">-respawn</literal></entry>
</row>
<row>
<entry><literal REMAP="tt">0x0006</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>fast </entry>
<entry>0: off, !=0: on, <literal REMAP="tt">argv</literal> - number of <literal REMAP="tt">-fast</literal></entry>
</row>
<row>
<entry><literal REMAP="tt">0x0007</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>nomonsters </entry>
<entry>0: off, !=0: on, <literal REMAP="tt">argv</literal> - number of <literal REMAP="tt">-nomonsters</literal></entry>
</row>
<row>
<entry><literal REMAP="tt">0x0008</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>recording player </entry>
<entry>0-3</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0009</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>green player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000A</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>indigo player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000B</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>brown player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000C</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>red player </entry>
<entry>0: inactive, 1: active</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>

<table>
<title>Known version bytes.</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>dec </entry>
<entry>hex </entry>
<entry> game(s)</entry>
</row>
<row>
<entry>104 </entry>
<entry>0x68 </entry>
<entry>DOOM 1.4beta</entry>
</row>
<row>
<entry>105 </entry>
<entry>0x69 </entry>
<entry>DOOM 1.5beta</entry>
</row>
<row>
<entry>106 </entry>
<entry>0x6A </entry>
<entry>DOOM 1.6beta, DOOM 1.666 and DOOM &rsqb;&lsqb; 1.666</entry>
</row>
<row>
<entry>107 </entry>
<entry>0x6B </entry>
<entry>DOOM &rsqb;&lsqb; 1.7 and DOOM &rsqb;&lsqb; 1.7a</entry>
</row>
<row>
<entry>108 </entry>
<entry>0x6C </entry>
<entry>DOOM 1.8 and DOOM &rsqb;&lsqb; 1.8</entry>
</row>
<row>
<entry>109 </entry>
<entry>0x6D </entry>
<entry>(Ultimate) DOOM 1.9 and DOOM &rsqb;&lsqb; 1.9</entry>
</row>
<row>
<entry>110 </entry>
<entry>0x6E </entry>
<entry>Published DOOM source</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>Now it is very easy to change an existing LMP from one format to the other.
The movement algorithm didn't changed from DOOM 1.2 to DOOM 1.666.
This is only true if the map also didn't changed. So you can't recycle LMP's
of E1M4. It is very interesting, that DOOM 1.666 LMP's, recorded even with 
the <literal REMAP="tt">-turbo</literal> option work with DOOM 1.2.</para>
</sect2>
<sect2>
<title>HEXEN demo, HEXEN 1.0</title>
<para>

<table>
<title>11 byte header of HEXEN 1.0</title>
<tgroup COLS="4">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>address </entry>
<entry>type </entry>
<entry>contents </entry>
<entry>range</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0000</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>skill </entry>
<entry>0-4</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0001</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>episode </entry>
<entry>1</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0002</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>map </entry>
<entry>1-40</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0003</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>blue player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0004</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>blue player's class </entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0005</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>red player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0006</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>red player's class </entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0007</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>yellow player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0008</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>yellow player's class</entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0009</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>green player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000A</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>green player's class </entry>
<entry>0-2</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
</sect2>
<sect2>
<title>HEXEN 1.1</title>
<para>

<table>
<title>19 byte header for HEXEN 1.1 (with up to 8 players).</title>
<tgroup COLS="4">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>address </entry>
<entry>type </entry>
<entry>contents </entry>
<entry>range</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0000</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>skill </entry>
<entry>0-4</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0001</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>episode </entry>
<entry>1</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0002</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>map </entry>
<entry>1-40</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0003</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>blue player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0004</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>blue player's class </entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0005</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>red player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0006</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>red player's class </entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0007</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>yellow player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0008</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>yellow player's class</entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0009</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>green player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000A</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>green player's class </entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000B</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>jade player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000C</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>jade player's class </entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000D</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>white player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000E</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>white player's class </entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000F</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>hazel player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0010</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>hazel player's class </entry>
<entry>0-2</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0011</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>purple player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0012</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>purple player's class </entry>
<entry>0-2</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
</sect2>
<sect2>
<title>STRIFE</title>
<para>

<table>
<title>16 byte header of STRIFE with an improved (8 players) DOOM &rsqb;&lsqb; engine.</title>
<tgroup COLS="4">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>address </entry>
<entry>type </entry>
<entry>contents </entry>
<entry>range</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0000</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>version </entry>
<entry>101 (version 1.0)</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0001</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>skill </entry>
<entry>0-4</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0002</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>map </entry>
<entry>32-??</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0003</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>multiplayer rule </entry>
<entry>0: Cooperative, 1: DeathMatch, 2: AltDeath</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0004</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>respawn </entry>
<entry>0: off, !=0: on, <literal REMAP="tt">argv</literal> - number of <literal REMAP="tt">-respawn</literal></entry>
</row>
<row>
<entry><literal REMAP="tt">0x0005</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>fast </entry>
<entry>0: off, !=0: on, <literal REMAP="tt">argv</literal> - number of <literal REMAP="tt">-fast</literal></entry>
</row>
<row>
<entry><literal REMAP="tt">0x0006</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>nomonsters </entry>
<entry>0: off, !=0: on, <literal REMAP="tt">argv</literal> - number of <literal REMAP="tt">-nomonsters</literal></entry>
</row>
<row>
<entry><literal REMAP="tt">0x0007</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>recording player </entry>
<entry>0-7</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0008</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>brown player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x0009</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>red player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000A</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>redbrown player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000B</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>grey player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000C</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>dark green player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000D</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>gold player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000E</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>bright green player </entry>
<entry>0: inactive, 1: active</entry>
</row>
<row>
<entry><literal REMAP="tt">0x000F</literal> </entry>
<entry><literal REMAP="tt">byte</literal> </entry>
<entry>super-hero blue player </entry>
<entry>0: inactive, 1: active</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
</sect2>
</sect1>
<sect1>
<title>Data</title>
<sect2 ID="NUMBER">
<title>Number of game tics</title>
<para>This formula for the number of game tics (NGT) follows from the section 
<xref LINKEND="INTRO">. 
section:

<screen>                     filelength-headerlength-1
        NGT = ---------------------------------------
               bytes per gametic * number of players</screen>

The NGT stored in a LMP can also be found out with the <literal REMAP="tt">-timedemo</literal>
option.
At the replay end, the game shows the number of game tics and time tics.
This game tic number corresponds with NGT only in newer versions of 
DOOM (&gt;=1.4), in DOOM &rsqb;&lsqb; and STRIFE. Older versions of DOOM
report the wrong number
(NGT+1). In HERETIC and HEXEN the <literal REMAP="tt">-timedemo</literal> option doesn't work at all.</para>
<para>With <literal REMAP="tt">-timedemo</literal> the game plays <emphasis>all</emphasis> scenes in the LMP file back 
but without any synchronizing. So you can calculate the frames per second 
also with:

<screen>                           NGT
                  fps = --------- * 35
                        time tics</screen>

This has nothing to do with your frame rate during the game.
This frame rate can be computed with the formula (from the DOOM FAQ v6.666
&lsqb;9-2-1&rsqb;,
thanks to Hank Leukart 
(<ulink URL="mailto:ap641@cleveland.freenet.edu">ap641@cleveland.freenet.edu</ulink>))

<screen>                           70
                  fps = --------
                        dots + 1</screen>

The dots are displayed in DOOM and DOOM &rsqb;&lsqb; with the <literal REMAP="tt">-devparm</literal>
option in the lower left edge and in HEXEN with the <literal REMAP="tt">TICKER</literal> 
cheat code (4 level demo: <literal REMAP="tt">RRETTENMUND</literal>) in the upper left edge of the screen. 
In STRIFE the <literal REMAP="tt">TIC</literal> cheat code toggles these dots.
There are only 35 screens per second 
(each game tic), so one dot is always displayed. With every additional dot, 
the game shows how many vertical sync impulses (1/70s) were necessary 
to compute a whole screen. The game is not slower but you don't see each
screen: the game becomes jerky.</para>
</sect2>
<sect2>
<title>Multiplayer LMP</title>
<para>In a 2, 3 or 4 player game the game tics are stored alternately, ie for a
2 player game:

<screen>game tic 1 of player 0
game tic 1 of player 1
game tic 2 of player 0
game tic 2 of player 1
game tic 3 of player 0
game tic 3 of player 1
           .
           .
           .  </screen>

The problem with multiplayer records is the last game tic. It is indeed
possible, to end a LMP file not with the actions of the last player. 
So the formula with the filelength in the section 
<xref LINKEND="NUMBER"> is sometimes not correct.</para>
</sect2>
<sect2>
<title>The <literal REMAP="tt">-turbo</literal> parameter (new DOOM, DOOM &rsqb;&lsqb; and STRIFE only)</title>
<para>This parameter speeds up all moves (forward, backward, strafe sideways) but
not the turn. Due to the value sets described in the section 
<xref LINKEND="DATA"> all move bytes
can be multiplied by 2.55 (or 255&percnt;) until they don't fit in a short int.
This is exactly what can happen. </para>
<para>All normal move bytes are multiplied by the turbo value in percent.
So you can play with <literal REMAP="tt">-turbo 200</literal> a normal game but your speed is
the same as the shift key is always pressed. If you now press the shift key,
you are running like hell.</para>
<para>The <literal REMAP="tt">-turbo</literal> parameter isn't stored in the LMP but the game shows in the
message line, if a player plays with <literal REMAP="tt">-turbo</literal> (ie ``green is turbo'').
The game concludes this from very large move bytes.</para>
</sect2>
<sect2 ID="DATA">
<title>Data description</title>
<para>There are 3 different kinds of game tics in all the described games:
<variablelist>
<varlistentry>
<term>DOOM, DOOM II</term>
<listitem>
<para>

<screen>-----------------------------------------
|    0    |    1    |    2    |    3    |
|   go    | strafe  |  turn   |   use   |
-----------------------------------------</screen>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>HERETIC, HEXEN</term>
<listitem>
<para>

<screen>-------------------------------------------------------------
|    0    |    1    |    2    |    3    |    4    |    5    |
|   go    | strafe  |  turn   |   use   | vertical|artifacts|
-------------------------------------------------------------</screen>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>STRIFE</term>
<listitem>
<para>

<screen>-------------------------------------------------------------
|    0    |    1    |    2    |    3    |    4    |    5    |
|   go    | strafe  |  turn   |   use   | special |artifacts|
-------------------------------------------------------------</screen>

</para>
</listitem>
</varlistentry>
</variablelist></para>
<sect3>
<title>Byte 0x00: Go Forward and Backward</title>
<para>The go byte contains a signed number (-127 ... 127), where 
positive numbers describe a forward and negative numbers a backward move. </para>
<para>The possible range of the values in the go byte varies a lot:

<screen>                   keyboard/gamepad/joystick      mouse
                      speed off  speed on    
old DOOM (&lt;1.4)        -25 +25   -50 +50       -50 .. +50 
new DOOM (&gt;=1.4)       -25 +25   -50 +50       -50 .. +50  *turbo/100
DOOM &rsqb;&lsqb;                -25 +25   -50 +50       -50 .. +50  *turbo/100
HERETIC                -25 +25   -50 +50       -50 .. +50 
HEXEN fighter          -29 +29   -60 +60       -60 .. +60 
HEXEN fighter (boots)  -44 +43   -90 +90       -90 .. +90
HEXEN cleric           -25 +25   -50 +50       -50 .. +50
HEXEN cleric (boots)   -38 +37   -75 +75       -75 .. +75
HEXEN mage             -21 +21   -45 +45       -45 .. +45 
HEXEN mage (boots)     -32 +31   -68 +67       -68 .. +67
STRIFE                 -25 +25   -50 +50       -50 .. +50  *turbo/100</screen>

</para>
</sect3>
<sect3>
<title>Byte 0x01: Strafe Sideways</title>
<para>The strafe byte contains a signed number (-127 ... 127), where 
positive numbers describe a right and negative numbers a left move. </para>
<para>The possible range of the values in the strafe byte varies a lot:

<screen>                   keyboard/gamepad/joystick      mouse
                      speed off  speed on   (strafe on + turn) 
old DOOM (&lt;1.4)        -24 +24   -40 +40       -50 .. +50 
new DOOM (&gt;=1.4)       -24 +24   -40 +40       -50 .. +50  *turbo/100
DOOM &rsqb;&lsqb;                -24 +24   -40 +40       -50 .. +50  *turbo/100
HERETIC                -24 +24   -40 +40       -50 .. +50 
HEXEN fighter          -27 +27   -59 +59       -60 .. +60 
HEXEN fighter (boots)  -41 +40   -89 +88       -90 .. +90
HEXEN cleric           -24 +24   -40 +40       -50 .. +50
HEXEN cleric (boots)   -36 +36   -60 +60       -75 .. +75
HEXEN mage             -21 +21   -37 +37       -45 .. +45 
HEXEN mage (boots)     -32 +31   -56 +55       -68 .. +67
STRIFE                 -24 +24   -40 +40       -50 .. +50  *turbo/100</screen>

</para>
</sect3>
<sect3>
<title>Byte 0x02: Turn</title>
<para>The turn byte contains a signed number (-127 ... 127), where 
positive numbers describe a left and negative numbers a right turn. 
The possible range of the values in the turn byte varies a lot:

<screen>                   keyboard/gamepad/joystick        mouse     DOOM mouse spinner
                    speed off      speed on 
                  start   turn    start turn 
old DOOM (&lt;1.4)   -2 +1  -3 +2   -2 +1 -5 +5    -127 .. +127     +128
HERETIC           -2 +1  -3 +2   -2 +1 -5 +5    -127 .. +127     +128
HEXEN             -2 +1  -3 +2   -2 +1 -5 +5    -127 .. +127     +128
new DOOM (&gt;=1.4)  -1 +1  -2 +3   -1 +1 -5 +5    -127 .. +127     +128
DOOM &rsqb;&lsqb;           -1 +1  -2 +3   -1 +1 -5 +5    -127 .. +127     +128
STRIFE            -1 +1  -2 +3   -1 +1 -5 +5    -127 .. +127     +128</screen>

Therefore a right turn is in old DOOM, HERETIC and HEXEN faster and in 
new DOOM, DOOM &rsqb;&lsqb; and STRIFE slower than a left turn.</para>
<para>The turn angle is

<screen>          360
          --- * turn_byte degree
          256   </screen>

With the DOOM cheat code <literal REMAP="tt">IDMYPOS</literal> you can check your current viewing
direction. During 
recording the games use only one byte out of a long for the viewing angle:

<screen>        (0x40)
          N

(0x80) W   +   E (0x00)

          S 
        (0xC0)</screen>

The turn byte is the increment of the viewing angle.</para>
</sect3>
<sect3>
<title>Byte 0x03: Use</title>
<para>In the use byte are coded the fire weapon, the press button/open door and the
change weapon actions:

<screen>--------------------------------------------
| 7     | 6  | 5  | 4  | 3  | 2  | 1  | 0  |
| SA=0  | 0  |    Weapon    | WB | UB | FB |
--------------------------------------------</screen>

The Fire Bit (FB) is 1 during a shot. The Use Bit (UB) indicates the use 
of anything (press a button, open a door etc.). The Weapon Bit (WB) is 1 if 
the player changes manually his weapon. The weapon number is stored in the 
following bits.</para>
<para>The internal weapon numbers are beginning with 0; not with 1 as is the status
bar:</para>
<para>Code := 4 + 8* (Weapon-1)</para>
<para>The codes for the different games are in the tables.

<table>
<title>DOOM</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>no </entry>
<entry> hex </entry>
<entry> name</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>Fist/Chainsaw</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x0C</literal> </entry>
<entry>Pistol</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x14</literal> </entry>
<entry>Shotgun</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x1C</literal> </entry>
<entry>Chaingun</entry>
</row>
<row>
<entry>5 </entry>
<entry><literal REMAP="tt">0x24</literal> </entry>
<entry>Rocket Launcher</entry>
</row>
<row>
<entry>6 </entry>
<entry><literal REMAP="tt">0x2C</literal> </entry>
<entry>Plasma Rifle</entry>
</row>
<row>
<entry>7 </entry>
<entry><literal REMAP="tt">0x34</literal> </entry>
<entry>BFG 9000</entry>
</row>
<row>
<entry>8 </entry>
<entry><literal REMAP="tt">0x3C</literal> </entry>
<entry>Chainsaw</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>

<table>
<title>DOOM II</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>no </entry>
<entry> hex </entry>
<entry> name</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>Fist/Chainsaw</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x0C</literal> </entry>
<entry>Pistol</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x14</literal> </entry>
<entry>Shotgun/Super Shotgun</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x1C</literal> </entry>
<entry>Chaingun</entry>
</row>
<row>
<entry>5 </entry>
<entry><literal REMAP="tt">0x24</literal> </entry>
<entry>Rocket Launcher</entry>
</row>
<row>
<entry>6 </entry>
<entry><literal REMAP="tt">0x2C</literal> </entry>
<entry>Plasma Rifle</entry>
</row>
<row>
<entry>7 </entry>
<entry><literal REMAP="tt">0x34</literal> </entry>
<entry>BFG 9000</entry>
</row>
<row>
<entry>8 </entry>
<entry><literal REMAP="tt">0x3C</literal> </entry>
<entry>Chainsaw</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>

<table>
<title>HERETIC</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>no </entry>
<entry> hex </entry>
<entry> name</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>Staff/Gauntlets</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x0C</literal> </entry>
<entry>Elvenwand</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x14</literal> </entry>
<entry>Ethereal Crossbow</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x1C</literal> </entry>
<entry>Dragon Claw</entry>
</row>
<row>
<entry>5 </entry>
<entry><literal REMAP="tt">0x24</literal> </entry>
<entry>Hellstaff</entry>
</row>
<row>
<entry>6 </entry>
<entry><literal REMAP="tt">0x2C</literal> </entry>
<entry>Phoenix Rod</entry>
</row>
<row>
<entry>7 </entry>
<entry><literal REMAP="tt">0x34</literal> </entry>
<entry>Mace</entry>
</row>
<row>
<entry>8 </entry>
<entry><literal REMAP="tt">0x3C</literal> </entry>
<entry>Gauntlets</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>

<table>
<title>HEXEN: fighter</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>no </entry>
<entry> hex </entry>
<entry> name</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>Spiked Gauntlets</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x0C</literal> </entry>
<entry>Timon's Axe</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x14</literal> </entry>
<entry>Hammer of Retribution</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x1C</literal> </entry>
<entry>Quietus</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>

<table>
<title>HEXEN: cleric</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>no </entry>
<entry> hex </entry>
<entry> name</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>Mace of Contrition</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x0C</literal> </entry>
<entry>Serpent</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x14</literal> </entry>
<entry>Firestorm</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x1C</literal> </entry>
<entry>Justifier</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>

<table>
<title>HEXEN: mage</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>no </entry>
<entry> hex </entry>
<entry> name</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>Sapphire Wand</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x0C</literal> </entry>
<entry>Frost Shards</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x14</literal> </entry>
<entry>Arc of Death</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x1C</literal> </entry>
<entry>Bloodscourge</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>

<table>
<title>STRIFE</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>no </entry>
<entry> hex </entry>
<entry> name</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>Punch Dagger</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x0C</literal> </entry>
<entry>Crossbow</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x14</literal> </entry>
<entry>Pulse Rifle</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x1C</literal> </entry>
<entry>Missile Launcher</entry>
</row>
<row>
<entry>5 </entry>
<entry><literal REMAP="tt">0x24</literal> </entry>
<entry>Grenade Launcher</entry>
</row>
<row>
<entry>6 </entry>
<entry><literal REMAP="tt">0x2C</literal> </entry>
<entry>Flame Thrower</entry>
</row>
<row>
<entry>7 </entry>
<entry><literal REMAP="tt">0x34</literal> </entry>
<entry>Blaster</entry>
</row>
<row>
<entry>8 </entry>
<entry><literal REMAP="tt">0x3C</literal> </entry>
<entry>Sigil</entry>
</row>
<row>
<entry>9 </entry>
<entry><literal REMAP="tt">0x44</literal> </entry>
<entry>Punch Dagger</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>The bits can be composed. So you can with a use byte of 0x03 fire and use
at the same time.</para>
<para>If the Special Actions (SA) bit is 1, the meaning of the other bits
changes totally:</para>
<para>In the bits 0 and 1 is now coded the Special Action itself.

<screen>-----------------
|1|x|x|x|x|x|0|1|       stands for pause/unpause
-----------------</screen>

and

<screen>-----------------
|1|x|x| SLN |1|0|       stands for save game in slot SLN (0&lt;=SLN&lt;=7).
----------------- </screen>

The x-bits aren't important at all. The games themselves let them 0 but do not
analyze them afterwards. </para>
<para>The games save a game state even during the replay of a LMP. So make sure you
have no important game states in your directory if you plan to play back a
unknown LMP file. You can remove the ``Save Game'' commands with <literal REMAP="tt">LMPC</literal>,
the Little Movie Processing Centre. Get the current version from my  
<ulink URL="http://demospecs.half-empty.de">Demo Specs page</ulink>.</para>
</sect3>
<sect3>
<title>Byte 0x04: Look and Fly</title>
<para>This byte appears in HERETIC and HEXEN LMP files <emphasis>only</emphasis>.</para>
<para>The Look an Fly byte is divided in 2 parts: 

<screen>-----------------
|7|6|5|4|3|2|1|0|
|  fly  | look  |
-----------------</screen>

Both parts contain a signed 4-bit number, where positive numbers describe a
upwards and negative numbers a downwards move.

<table>
<title>Look- and Fly-values.</title>
<tgroup COLS="4">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>game </entry>
<entry>speed off </entry>
<entry>speed on </entry>
<entry>center/drop</entry>
</row>
<row>
<entry>HERETIC </entry>
<entry>-3, +3 </entry>
<entry>-5, +5 </entry>
<entry>+8</entry>
</row>
<row>
<entry>HEXEN </entry>
<entry>-1, +1 </entry>
<entry>-2, +2 </entry>
<entry>+8</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>The pure ``drop'' (landing) code (0x80) could be ambiguous (the quit 
byte is 0x80). Moreover it is always good to look forward after landing.
Therefore creates a ``drop'' always a ``look forward''. This
results in the code 0x88.</para>
</sect3>
<sect3>
<title>Byte 0x05: Use artifacts</title>
<para>This byte appears in HERETIC and HEXEN LMP files <emphasis>only</emphasis>.</para>
<para>The cursor movements in the inventory isn't recorded. Only the use of an
artifact is recorded. The ``Use artifacts'' byte contains simply the number of
the artifact equivalent to the HERETIC ``<literal REMAP="tt">gimme</literal>''-cheat.

<table>
<title>HERETIC artifacts.</title>
<tgroup COLS="4">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>no </entry>
<entry>code </entry>
<entry>letter </entry>
<entry>name</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x01</literal> </entry>
<entry>a </entry>
<entry>ring of invincibility</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x02</literal> </entry>
<entry>b </entry>
<entry>shadowsphere</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x03</literal> </entry>
<entry>c </entry>
<entry>quartz flask</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>d </entry>
<entry>chaos device</entry>
</row>
<row>
<entry>5 </entry>
<entry><literal REMAP="tt">0x05</literal> </entry>
<entry>e </entry>
<entry>tome of power</entry>
</row>
<row>
<entry>6 </entry>
<entry><literal REMAP="tt">0x06</literal> </entry>
<entry>f </entry>
<entry>torch</entry>
</row>
<row>
<entry>7 </entry>
<entry><literal REMAP="tt">0x07</literal> </entry>
<entry>g </entry>
<entry>time bomb of the ancients</entry>
</row>
<row>
<entry>8 </entry>
<entry><literal REMAP="tt">0x08</literal> </entry>
<entry>h </entry>
<entry>morph ovum</entry>
</row>
<row>
<entry>9 </entry>
<entry><literal REMAP="tt">0x09</literal> </entry>
<entry>i </entry>
<entry>wings of wrath</entry>
</row>
<row>
<entry>10 </entry>
<entry><literal REMAP="tt">0x0A</literal> </entry>
<entry>j </entry>
<entry>mystic urn</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>A similar cheat code for HEXEN isn't known.

<table>
<title>HEXEN artifacts.</title>
<tgroup COLS="4">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>no </entry>
<entry>code </entry>
<entry>letter </entry>
<entry>name</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x01</literal> </entry>
<entry>a </entry>
<entry>icon of the defender</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x02</literal> </entry>
<entry>b </entry>
<entry>quartz flask</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x03</literal> </entry>
<entry>c </entry>
<entry>mystic urn</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>d </entry>
<entry>clerical healing</entry>
</row>
<row>
<entry>5 </entry>
<entry><literal REMAP="tt">0x05</literal> </entry>
<entry>e </entry>
<entry>dark servant</entry>
</row>
<row>
<entry>6 </entry>
<entry><literal REMAP="tt">0x06</literal> </entry>
<entry>f </entry>
<entry>torch</entry>
</row>
<row>
<entry>7 </entry>
<entry><literal REMAP="tt">0x07</literal> </entry>
<entry>g </entry>
<entry>porkalator</entry>
</row>
<row>
<entry>8 </entry>
<entry><literal REMAP="tt">0x08</literal> </entry>
<entry>h </entry>
<entry>wings of wrath</entry>
</row>
<row>
<entry>9 </entry>
<entry><literal REMAP="tt">0x09</literal> </entry>
<entry>i </entry>
<entry>chaos device</entry>
</row>
<row>
<entry>10 </entry>
<entry><literal REMAP="tt">0x0A</literal> </entry>
<entry>j </entry>
<entry>flechette</entry>
</row>
<row>
<entry>11 </entry>
<entry><literal REMAP="tt">0x0B</literal> </entry>
<entry>k </entry>
<entry>banishment device</entry>
</row>
<row>
<entry>12 </entry>
<entry><literal REMAP="tt">0x0C</literal> </entry>
<entry>l </entry>
<entry>boots of speed</entry>
</row>
<row>
<entry>13 </entry>
<entry><literal REMAP="tt">0x0D</literal> </entry>
<entry>m </entry>
<entry>krater of might</entry>
</row>
<row>
<entry>14 </entry>
<entry><literal REMAP="tt">0x0E</literal> </entry>
<entry>n </entry>
<entry>dragonskin bracers</entry>
</row>
<row>
<entry>15 </entry>
<entry><literal REMAP="tt">0x0F</literal> </entry>
<entry>o </entry>
<entry>disc of repulsion</entry>
</row>
<row>
<entry>- </entry>
<entry><literal REMAP="tt">0x21</literal> </entry>
<entry> </entry>
<entry>panic button (use all you have)</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>The HEXEN-specific ``Jump'' is coded in the Use artifact byte.

<table>
<title>HEXEN jump.</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>dec </entry>
<entry>hex </entry>
<entry>name</entry>
</row>
<row>
<entry>128 </entry>
<entry>0x80 </entry>
<entry>jump</entry>
</row>
</tbody>
</tgroup>
</table>

A jump can be combined (with ``binary or'') with the
use of an artifact.</para>
</sect3>
<sect3>
<title>Byte 0x04: Special Use</title>
<para>This byte appears in STRIFE LMP files <emphasis>only</emphasis>.</para>
<para>

<table>
<title>The 8 toggle actions of STRIFE.</title>
<tgroup COLS="3">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>bit no </entry>
<entry>hex </entry>
<entry>meaning</entry>
</row>
<row>
<entry>0 </entry>
<entry><literal REMAP="tt">0x01</literal> </entry>
<entry>look up</entry>
</row>
<row>
<entry>1 </entry>
<entry><literal REMAP="tt">0x02</literal> </entry>
<entry>look down</entry>
</row>
<row>
<entry>2 </entry>
<entry><literal REMAP="tt">0x04</literal> </entry>
<entry>run</entry>
</row>
<row>
<entry>3 </entry>
<entry><literal REMAP="tt">0x08</literal> </entry>
<entry>use inventory (see section <xref LINKEND="STRIFEARTIFACTS">)</entry>
</row>
<row>
<entry>4 </entry>
<entry><literal REMAP="tt">0x10</literal> </entry>
<entry>drop inventory (see section <xref LINKEND="STRIFEARTIFACTS">)</entry>
</row>
<row>
<entry>5 </entry>
<entry><literal REMAP="tt">0x20</literal> </entry>
<entry>jump</entry>
</row>
<row>
<entry>6 </entry>
<entry><literal REMAP="tt">0x40</literal> </entry>
<entry>unknown</entry>
</row>
<row>
<entry>7 </entry>
<entry><literal REMAP="tt">0x80</literal> </entry>
<entry>use health</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
<para>Note bit 2. STRIFE is the only game with a special run code. It seems senseless,
because the go/strafe/turn-values are already ``run-changed''.</para>
<para>The cursor movements in the inventory isn't recorded. Only the use of an
artifact is recorded.
If bit 3 or 4 is 1 the next byte in the STRIFE game tic byte becomes important.</para>
</sect3>
<sect3 ID="STRIFEARTIFACTS">
<title>Byte 0x05: STRIFE Artifacts</title>
<para>This byte appears in STRIFE LMP files <emphasis>only</emphasis>.</para>
<para>This byte describes the artifact to use or to drop. 1 byte can hold up to
255 artifacts.

<table>
<title>12 known STRFE artifacts.</title>
<tgroup COLS="2">
<colspec COLSEP="0" ALIGN="LEFT">
<colspec COLSEP="0" ALIGN="LEFT">
<tbody>
<row>
<entry>code </entry>
<entry>name</entry>
</row>
<row>
<entry><literal REMAP="tt">0x74</literal> </entry>
<entry>toughness</entry>
</row>
<row>
<entry><literal REMAP="tt">0x75</literal> </entry>
<entry>accuracy</entry>
</row>
<row>
<entry><literal REMAP="tt">0x76</literal> </entry>
<entry>full health</entry>
</row>
<row>
<entry><literal REMAP="tt">0x7B</literal> </entry>
<entry>teleportor beacon</entry>
</row>
<row>
<entry><literal REMAP="tt">0x7C</literal> </entry>
<entry>metal armor</entry>
</row>
<row>
<entry><literal REMAP="tt">0x7D</literal> </entry>
<entry>leather armor</entry>
</row>
<row>
<entry><literal REMAP="tt">0xA1</literal> </entry>
<entry>med patch</entry>
</row>
<row>
<entry><literal REMAP="tt">0xA2</literal> </entry>
<entry>medical kit</entry>
</row>
<row>
<entry><literal REMAP="tt">0xA3</literal> </entry>
<entry>coin</entry>
</row>
<row>
<entry><literal REMAP="tt">0xA7</literal> </entry>
<entry>shadow armor</entry>
</row>
<row>
<entry><literal REMAP="tt">0xA8</literal> </entry>
<entry>environmental suit</entry>
</row>
<row>
<entry><literal REMAP="tt">0xB7</literal> </entry>
<entry>offering chalice</entry>
</row>
</tbody>
</tgroup>
</table>

</para>
</sect3>
<sect3>
<title>Special entries</title>
<para>If there are no actions at all, all 4 (or 6) bytes contain 0x00. This is a 
wait tic.</para>
<para>The end of the LMP is coded in the go byte of an incomplete game tic.
Because there is no go value of -128 (0x80), the game can't make a mistake.</para>
</sect3>
</sect2>
</sect1>
<sect1>
<title>Version History and Acknowledgments</title>
<para><variablelist>
<varlistentry>
<term>1.0, 30 August, 1994</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>first public release</para>
</listitem>
<listitem>
<para>many thanks to Steffen Winterfeldt 
(<ulink URL="mailto:wfeldt@itp.uni-leipzig.de">wfeldt@itp.uni-leipzig.de</ulink>)
for his reverse engineering work</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>1.10, 24 October, 1994</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>general release for DOOM</para>
</listitem>
<listitem>
<para>corresponds now to the LMP compiler <literal REMAP="tt">lmpc</literal> 2.1</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>1.20, 16 January, 1995</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>included information about DOOM &rsqb;&lsqb; and HERETIC</para>
</listitem>
<listitem>
<para>first HTML version</para>
</listitem>
<listitem>
<para>thanks to Frans P. de Vries 
(<ulink URL="mailto:fpv@xymph.iaf.nl">fpv@xymph.iaf.nl</ulink>), 
who corrected some orthographical bugs</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>1.21, 22 February, 1995</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>weapon names for HERETIC</para>
</listitem>
<listitem>
<para>artifact names for registered HERETIC</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>1.22, 8 October, 1995</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>correct multiplayer colors</para>
</listitem>
<listitem>
<para>included first information about HEXEN (taken from the 4-level-beta)</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>1.23, 9 October, 1995</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>artifact names for HEXEN</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>1.24, 10 October, 1995</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>go/strafe ranges reorganized (``boots of speed'' included)</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>1.25, 25 October, 1995</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>first Linuxdoc-SGML version, text and ps-versions are available too</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>1.26, 20 November, 1995</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>some small mistakes in the movement byte table corrected,
thanks to Rob McCartney 
(<ulink URL="mailto:argon@netcom.com">argon@netcom.com</ulink>)
for his bug report</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>2.0.0, 21 November, 1995,  uploaded to 
<ulink URL="ftp://ftp.cdrom.com/">ftp.cdrom.com</ulink> 
and announced in
<ulink URL="news:rec.games.comp.doom.announce">rec.games.comp.doom.announce</ulink></term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>new 3 part version number</para>
</listitem>
<listitem>
<para>rearrangements of the tables</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>2.1.0, 10 March, 1996, uploaded to 
<ulink URL="ftp://ftp.cdrom.com/">ftp.cdrom.com</ulink>
and announced in
<ulink URL="news:rec.games.comp.doom.announce">rec.games.comp.doom.announce</ulink></term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>STRIFE information included</para>
</listitem>
<listitem>
<para>rearrangements of the tables</para>
</listitem>
<listitem>
<para>strafe table corrected</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>2.1.1, 7 April, 1996 </term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>HEXEN 1.1 information included</para>
</listitem>
<listitem>
<para>HEXEN panic button described</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>2.1.2, 20 April, 1996 </term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>STRIFE 1.1 information included (player colors)</para>
</listitem>
<listitem>
<para>table of all covered game versions</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
<varlistentry>
<term>2.1.3, 12 March, 1998</term>
<listitem>
<para>

<itemizedlist>
<listitem>
<para>PlanetQuake is the new home.</para>
</listitem>
<listitem>
<para>SGML-Tools 1.0.5 used.</para>
</listitem>
</itemizedlist>

</para>
</listitem>
</varlistentry>
</variablelist></para>
</sect1>
</article>
