  The Little Movie Processing Centre
  Uwe Girlich, uwe@planetquake.com
  v3.2.8, 6/3/1999, (bug fix release)

  This document is the user's guide of The Little Movie Processing Cen-
  tre (LMPC).  LMPC is a utility to handle DOOM, DOOM ][, HERETIC, HEXEN
  and STRIFE LMP files. There is a rudimentary support for Duke Nukem 3D
  and Redneck Rampage DMO files. Quake DEM files, QuakeWorld QWD files
  and Quake II DM2 files (client and server recorded) are supported too.
  The DEM file cutter tool (DEMcut), The DEM Text File Analyser (DEMA),
  The Demo Broadcasting Server (DBS) and The DM2 file concatenator
  (DM2cat) are part of this package as well.
  ______________________________________________________________________

  Table of Contents



















































  1. Introduction

  2. LMPC, The Little Movie Processing Centre

     2.1 Introduction
     2.2 Command line parameters
        2.2.1 Syntax description
        2.2.2 Information about a LMP, DMO, DEM, QWD or DM2 file
        2.2.3 LMP/DMO/DEM/QWD/DM2 text converter (decompiler)
        2.2.4 LMP/DEM/QWD/DM2 binary converter (compiler)
        2.2.5 LMP file version change
        2.2.6 LMP file player's view change
        2.2.7 LMP file ``Wait'' (
        2.2.8 LMP file clean-up: ``Pause'' (
        2.2.9 LMP file clean-up: ``Save Game'' (
        2.2.10 DEM/DM2 file repair: multi-level files
        2.2.11 Game type determination
     2.3 Bugs and limitations

  3. DEMA, The DEM Text File Analyser

  4. DEMcut, The DEM file cutter tool

     4.1 Introduction
     4.2 Batch usage
     4.3 Interactive usage
     4.4 Commands
        4.4.1 Help
        4.4.2 Output file
        4.4.3 DEM file
        4.4.4 Speed
        4.4.5 Time
        4.4.6 Loop
        4.4.7 CD track
        4.4.8 Frame
        4.4.9 Range
        4.4.10 Multi-player preparing
        4.4.11 Interactive mode
        4.4.12 Quit
     4.5 Example
     4.6 Problems, ideas and everything

  5. DBS, The Demo Broadcasting Server

     5.1 Introduction
     5.2 Command line parameters
        5.2.1 Syntax description
        5.2.2 Version
        5.2.3 Port
        5.2.4 Maximum number of players
     5.3 What DBS does

  6. DM2cat, The DM2 file concatenator

  7. LS format

     7.1 Introduction
     7.2 Header Area
     7.3 Data Area
        7.3.1 Movements
        7.3.2 Use (LMP only)
        7.3.3 Fly and Look (HERETIC and HEXEN only)
        7.3.4 Use Artifact (HERETIC and HEXEN only)
        7.3.5 STRIFE Artifacts
        7.3.6 Jump (HEXEN and STRIFE only)
        7.3.7 STRIFE actions
        7.3.8 Use (DMO only)
        7.3.9 Special Codes

  8. DEM source format

  9. QWD source format

  10. DM2 source format

  11. More tools and information

  12. History and future of LMPC



  ______________________________________________________________________

  11..  IInnttrroodduuccttiioonn

  LMPC is the name of the complete package and the name of the biggest
  parts in it: The Little Movie Processing Centre.

  LMPC is a collection of utilities to handle old (<=1.4) and new DOOM,
  DOOM ][, HERETIC, HEXEN and STRIFE LMP files. There is support for
  Duke Nukem 3D and Redneck Rampage DMO files, Quake DEM files,
  QuakeWorld QWD files and Quake II DM2 files (client and server
  recorded) too.

  You can download the package from my Demo Specs page
  <http://www.planetquake.com/demospecs>.

  It is based upon the information in the Unofficial LMP format
  description <http://www.planetquake.com/demospecs/lmp>, the Unofficial
  DMO format description <http://www.planetquake.com/demospecs/dmo>, the
  Unofficial DEM format description
  <http://www.planetquake.com/demospecs/dem>, the Unofficial QWD format
  description <http://www.planetquake.com/demospecs/qwd> and the
  Unofficial DM2 format description
  <http://www.planetquake.com/demospecs/dm2>.

  Read the apropriate document to find out the exact version numbers
  supported by LMPC. I write the format description and the program at
  the same time; so if it is described in the specs document, it is in
  general supported by the LMPC program.


  22..  LLMMPPCC,, TThhee LLiittttllee MMoovviiee PPrroocceessssiinngg CCeennttrree



  22..11..  IInnttrroodduuccttiioonn


  With LMPC you can get information about a LMP, DMO, DEM, QWD or DM2
  file, change the version and viewing player's number, add some wait
  tics at the end, remove the pause tics, clear the ``Save Game'' tics
  and (this is the main part) you can compile and decompile a LMP, DMO,
  DEM, QWD or DM2 from and to a LS file. LS stands for ``_LMP _Source''.
  To reduce the amount of new abbreviations I call the ``DMO Source'' LS
  too.  The language is similar and will be treated in the same way.
  The real LS language is documented at full length in the section ``LS
  format''.  The ``DEM Source'' (see section ``DEM source format'') and
  all the more the ``QWD Source'' (see section ``QWD source format'') is
  totally different but I call it LS anyway.  The same holds for Quake
  II DM2 (see section ``DM2 source format'') files.

  22..22..  CCoommmmaanndd lliinnee ppaarraammeetteerrss

  LMPC is a command line oriented program. It uses the getopt_long
  library for the command line parsing.

  The LMP file convert options (--change-version, --change-player,
  --add-WT, --remove-pause and --clear-save) can be used together.


  22..22..11..  SSyynnttaaxx ddeessccrriippttiioonn


     SSyynnttaaxx::
        lmpc

     DDeessccrriippttiioonn::
        If you start LMPC without any command line parameters you
        receive the following syntax message:


          Little Movie Processing Centre
          LMPC (c) U. Girlich, 1994-99, Release 3.2.8 6/3/1999 (bug fix release)
          lmpc [option ...] filename [filename ...]
          -h, --help                   display this help and exit.
          -V, --version                output version information and exit.
          -i, --info                   prints out information about the LMP-files.
          -s, --to-txt                 binary/text to text conversion.
          -l, --to-bin                 binary/text, ... to binary conversion.
          -v, --change-version VERSION changes the version of a LMP-file to VERSION
                                       (0 means old DOOM).
          -p, --change-player PLAYER   changes the recording player of a LMP-file to
                                       PLAYER (0..3).
          -w, --add-WT SECONDS         adds SECONDS (int) WT game tics to the LMP file
          -r, --remove-pause           removes the game tics between PS and PE.
          -c, --clear-save             clears SG tics.
          -f, --fix-multi              fixes multi-level DEM and DM2 files.
          -t, --tic FROM(,|:)TO        converts only a part of the LMP-file
                                       (in connection with -s only).
          -g, --game GAME              forces game (GAME=DOOM,DOOM2,HERETIC,HEXEN,
                                       STRIFE,DUKE,REDNECK,QUAKE,QUAKEWORLD,QUAKE2)
                                       short: D2HXSNRQWq (only with -(i|s|v|p|w|r|c)).
          -m, --mark-step STEP         marks every STEPth tic in the LS file (-s only)
                                       STEP=0 doesn't mark any game tic; default: STEP=1.





  22..22..22..  IInnffoorrmmaattiioonn aabboouutt aa LLMMPP,, DDMMOO,, DDEEMM,, QQWWDD oorr DDMM22 ffiillee


     SSyynnttaaxx::
        lmpc [--info|-i] infile [infile ...]

     IInnppuutt FFiillee::
        infiles

     DDeessccrriippttiioonn::
        LMPC reads each infile and prints out some information like
        game, version number, episode, map, skill, number of players,
        deathmatch/altdeath, nomonsters etc.  Please note: in the old
        DOOM format there is no version information, so if you check
        e.g. a 1.2 LMP file you receive only the vague information v<1.4
        instead of v1.2.  LMPC doesn't report any version for HERETIC
        and HEXEN LMP files.

        This option works for DMO files too. They will be detected
        automatically but you can use the --game DUKE option as well.

        This option works for DEM, QWD and DM2 files too. They will be
        detected automatically but you can use the --game QUAKE, --game
        QUAKEWORLD and --game QUAKE2 option as well. The information on
        DEM, QWD and DM2 files nearly zero beside the information that
        it is actually a DEM, QWD or DM2 file and the number of frames
        in binary DEM, QWD or DM2 files.

        To get more information of a DEM file convert it into a text
        file and use DEMA, The DEM Text File Analyser.


  22..22..33..  LLMMPP//DDMMOO//DDEEMM//QQWWDD//DDMM22 tteexxtt ccoonnvveerrtteerr ((ddeeccoommppiilleerr))


     SSyynnttaaxx::
        lmpc (--to-txt|-s) [(--tic|-t) FROM(,|:)TO] [(--mark-step|-m)
        STEP] infile txtfile

     IInnppuutt FFiillee::
        infile

     OOuuttppuutt FFiillee::
        txtfile

     DDeessccrriippttiioonn::
        LMPC reads the file infile, converts it to the corresponding
        text format and stores the result in the text file txtfile.
        infile may be a LMP binary, DMO binary, DEM binary, DEM text,
        QWD binary, QWD text, DM2 binary or DM2 text file. Most of the
        additional options do work with binary LMP files only.

        If the --tic option is used, only the part between gametic FROM
        and TO (inclusive) will be stored in the LS file.  A missing
        FROM means the start of the LMP file and a missing TO means the
        end of the LMP file.  FROM and TO are separated by a comma (,)
        or a colon (:). The MS-DOS version may have difficulties with
        comma as a separator because COMMAND.COM (4dos as well) splits a
        command line at spaces and commas. The TO part will become a
        different argument and might be interpreted as a file name.

        LMPC appends at the end of the LS file some useful additional
        information. For each player there is a statistics about his
        favourite movement codes and the portion of WT. Since you can
        achieve with keyboard/joystick only a few special movement
        codes, is is very easy to detect, if the player used a keyboard
        or a mouse. Some newbies don't use strafe, so LMPC shows also
        this handicap. The statistic takes in account always the full
        LMP file.

        From the favourite movement codes you can easily deduce the
        number behind a prospective -turbo parameter.

        If the --mark-step option is used LMPC will mark every STEPth
        game tic with the tic-number and the current time. The default
        STEP value is 1. If STEP=0 no marks are printed at all.

        Any --mark-step option in conjunction with a binary DEM, QWD and
        DM2 files is a special debug-option. It includes in the text
        file the frame number and the starting address of all messages.
        This option may be removed or changed in future releases.

        The --fix-multi option can be used together with --to-txt to
        repair the broken multi-level DEM and DM2 files.
  22..22..44..  LLMMPP//DDEEMM//QQWWDD//DDMM22 bbiinnaarryy ccoonnvveerrtteerr ((ccoommppiilleerr))


     SSyynnttaaxx::
        lmpc (--to-bin|-l) infile [infile ...] binfile

     IInnppuutt FFiillee::
        infiles

     OOuuttppuutt FFiillee::
        binfile

     DDeessccrriippttiioonn::
        LMPC reads the first file, determines the game type and compiles
        a binary file out of all the files on the command line. The
        binary (destination) file is always the last argument.

        This option works with LMP text files, DEM text, DEM binary, QWD
        text, QWD binary, DM2 text and DM2 binary files as input files
        only. LMPC can handle more than 1 input file with LMP text files
        only.

        For combination of DEM files use DEMcut.

        The --fix-multi option can be used together with --to-bin to
        repair the broken multi-level DEM and DM2 files.


  22..22..55..  LLMMPP ffiillee vveerrssiioonn cchhaannggee


     SSyynnttaaxx::
        lmpc (--change-version|-v) VERSION lmpfile1 [lmpfile2]

     IInnppuutt FFiillee::
        lmpfile1

     OOuuttppuutt FFiillee::
        lmpfile1 or [lmpfile2]

     DDeessccrriippttiioonn::
        LMPC reads the binary LMP file lmpfile1, changes the version
        number byte in lmpfile1 to the appropriate value or stores the
        result in lmpfile2.

        The VERSION can be the version byte itself (0 for the old LMP
        files) or anything like 1.4beta, 1.9 or whatever.

        There is no guarantee for a special LMP file to work with the
        new version!!


  22..22..66..  LLMMPP ffiillee ppllaayyeerr''ss vviieeww cchhaannggee


     SSyynnttaaxx::
        lmpc (--change-player|-p) PLAYER lmpfile1 [lmpfile2]

     IInnppuutt FFiillee::
        lmpfile1

     OOuuttppuutt FFiillee::
        lmpfile1 or [lmpfile2]

     DDeessccrriippttiioonn::
        LMPC reads the LMP file lmpfile1, changes the number of the
        player (0..3: new DOOM, DOOM ][; 0..7: STRIFE) with the main
        view (status bar, sound) in lmpfile1 or stores the result in
        lmpfile2.

        To change only the main player byte works only with new LMP
        files, since old ones are always recorded from the view of the
        first player (no. 0) and there is no information about this in
        the header.



  22..22..77..  LLMMPP ffiillee ````WWaaiitt'''' (( WWTT )) ttiiccss aaddddiittiioonn


     SSyynnttaaxx::
        lmpc (--add-WT|-w) SECONDS lmpfile1 [lmpfile2]

     IInnppuutt FFiillee::
        lmpfile1

     OOuuttppuutt FFiillee::
        lmpfile1 or [lmpfile2]

     DDeessccrriippttiioonn::
        LMPC reads the lmpfile1 and adds at the end


          SECONDS * 35 * player number


     empty (WT) game tics.  This results in a SECONDS seconds longer LMP
     file.

     With lmpfile2 the result will be written in lmpfile2. Without this
     parameter, lmpfile1 will be changed.

     This option is very useful for contest LMP files with a long
     visible summary screen.


  22..22..88..  LLMMPP ffiillee cclleeaann--uupp:: ````PPaauussee'''' (( PPSS ,, PPEE )) ttiiccss


     SSyynnttaaxx::
        lmpc (--remove-pause|-r) lmpfile1 [lmpfile2]

     IInnppuutt FFiillee::
        lmpfile1

     OOuuttppuutt FFiillee::
        [lmpfile2]

     DDeessccrriippttiioonn::
        LMPC reads the lmpfile1 and copies all game tics to lmpfile2.
        During the copy process LMPC scans the contents for Pause Start
        game tics (PS) and Pause End game tics (PE).

        The PS game tic will be copied to lmpfile2 but with an empty
        ``use byte''; the game tics between PS and PE (inclusive PE)
        wont be copied.

        Without the second filename LMPC will write to a temporary file
        and replaces at the end lmpfile1.

        The game tic numbers of PS and PE are printed during the
        conversion.
        You may have difficulties with the play back of such a patched
        LMP file.  This is the case if you patch a LMP file of a level
        with a revenant (skeleton). The revenant uses a random number
        generator to choose between a self controlled rocket and a
        normal rocket. The input of this generator are the last two bits
        of the game tic number. This means you have to make sure that
        you cut a number of game tics divisible by 4. In general this is
        impossible so do not use pause in levels with a revenant. An
        arch vile makes similar difficulties but I don't even know how
        to prevent it.


  22..22..99..  LLMMPP ffiillee cclleeaann--uupp:: ````SSaavvee GGaammee'''' (( SSGG )) ttiiccss


     SSyynnttaaxx::
        lmpc (--clear-save|-c) lmpfile1 [lmpfile2]

     IInnppuutt FFiillee::
        lmpfile1

     OOuuttppuutt FFiillee::
        [lmpfile2]

     DDeessccrriippttiioonn::
        LMPC reads the lmpfile1 and copies all game tics to lmpfile2.
        During the copy process LMPC scans the contents for Save Game
        game tics (SG). Every SG command will be cleared.  With lmpfile2
        the result will be written in lmpfile2. Without this parameter,
        lmpfile1 will be changed.


  22..22..1100..  DDEEMM//DDMM22 ffiillee rreeppaaiirr:: mmuullttii--lleevveell ffiilleess


     SSyynnttaaxx::
        lmpc (--fix-multi|-f) demofile

     IInnppuutt FFiillee::
        demofile

     OOuuttppuutt FFiillee::
        demofile

     DDeessccrriippttiioonn::
        Quake and Quake II have problems with the playback of multi-
        level recordings.  They usually stopp at the first level change.

        Read more about the background in the recording FAQ
        <http://www.planetquake.com/demospecs/faq/faq-2.html#ss2.1>.

        If the --fix-multi parameter comes without any conversion option
        on the command-line, LMPC repairs the demo file in question "in-
        place". This means LMPC overwrites the bad commands with nop or
        print.

        The --fix-multi option can be used together with --to-bin and
        --to-txt. LMPC removes the offending commands in this case.


  22..22..1111..  GGaammee ttyyppee ddeetteerrmmiinnaattiioonn


     SSyynnttaaxx::


     lmpc (--info|
           --change-version|
           --change-player|
           --to-txt|
           --add-WT|
           --remove-pause) (--game|-g) GAME binfile [filename ...]




     IInnppuutt FFiillee::
        binfile

     OOuuttppuutt FFiillee::
        action dependent

     DDeessccrriippttiioonn::
        LMPC determines the game type of a LMP (binary), DMO (binary),
        DEM (text and binary), QWD (text and binary) or DM2 (text and
        binary) file very good. But it can't good distinguish between
        HERETIC/HEXEN and old DOOM LMP files. Moreover it can't
        distinguish at all between DOOM ][ Map 1-9 and new DOOM Episode
        1 LMP files. The latter case is not very important but the first
        is more severe. To force LMPC to use a particular game type use
        --game.  GAME can be DOOM, DOOM2, HERETIC, HEXEN, STRIFE, DUKE,
        REDNECK, QUAKE, QUAKEWORLD or QUAKE2 or the short form D, 2, H,
        X, S, N, R, Q, W or q.


  22..33..  BBuuggss aanndd lliimmiittaattiioonnss

  To distinguish between old DOOM, HERETIC and HEXEN LMP files I use a
  simple turn-byte-average algorithm. This fails, if the LMP file is too
  short or you turn always in the same direction and never go forward.
  Due to the header change in HEXEN 1.1, it is nearly impossible to
  distinguish fast between HERETIC and HEXEN 1.1 LMP files. LMPC looks
  then at the file date and treats files with an creation year >=1996 as
  HEXEN and all others as HERETIC files. This is totally stupid but what
  else can I do?

  LMPC supports client side recorded DM2 files and DM2 files recorded by
  the console command _s_e_r_v_e_r_r_e_c_o_r_d (working from Quake II version 3.15).
  One single DM2 file can even contain parts from both sides.  Quake II
  may only playback client side recordings.

  If you produced a good recording file (at least some minutes and with
  some action) and LMPC can not detect the game type, please send it to
  me.  Up to a corrected version make sure to use the --game option.
  Some hints to solve the problem are welcome as well.

  The *number repeat code in LS files really repeats this line number
  times and does not care about multi player-game tics.

  The MS-DOS binary of LMPC converts all file names to lower case to
  simplify the name handling. The tolower C-function doesn't converts
  any kind of special characters like oe or e. This can cause some
  severe data lost.

  I use a redundancy in DEM files to detect Quake cheaters. My simple
  check will fail if the player gets hit and he gets a medikit at the
  very same time.  This can happen, if a player is standing over a
  medikit, when the hit comes.

  Some versions of Quake use a slightly different DEM format.
  LMPC/DEMcut can read this ``new'' format but they write the old 1.06
  format.  SQuake 1.07 for Linux behaves similar: it writes the old
  format but can play back the old and the new format.

  Keygrip 2 writes DM2 files with non-conform bit mask values in ssoouunndd,
  ssppaawwnnbbaasseelliinnee and ppaacckkeetteennttiittiieess messages. LMPC tries its best to
  decompile even such bad files too but it may well be, that some other
  messages with bit masks have the same problem.


  33..  DDEEMMAA,, TThhee DDEEMM TTeexxtt FFiillee AAnnaallyysseerr

  To analyse a DEM file convert it into a text file and use DEMA. DEMA
  is a very simple Perl script, which may give you the time per level,
  the level name and the average frame time (client update time).

  This Perl script is total incomplete but it may be helpful yet. There
  are no command line switches. You have to edit the script to change
  the summary.

  I wrote DEMA in Perl, which is very good at pattern matching and
  extraction.  I will _n_e_v_e_r write a C version, so write one yourself or
  install Perl.

  The main aim of DEMA is to show a sample framework for any kind of DEM
  text analysing.


  44..  DDEEMMccuutt,, TThhee DDEEMM ffiillee ccuutttteerr ttooooll


  44..11..  IInnttrroodduuccttiioonn

  DEMcut is the DEM file cutter tool. I don't know anything about movie
  cutting whatsoever but DEMcut should help you a lot cutting parts out
  of a DEM file, putting different DEM files together or using some
  special effects like slow-motion or backward moving of particular
  scenes.

  DEMcut does all this and much more in a very easy way: It gets the
  names of all DEM files to be processed from the command line and reads
  from ``Standard In'' commands to manipulate them.  During the
  manipulation DEMcut writes one or more DEM files.

  A good knowledge of DEM files is required to use DEMcut. DEMcut
  doesn't do any checks to prevent you from creating non-working files.


  44..22..  BBaattcchh uussaaggee

  The easiest way to use DEMcut is with a cutting list batch file. This
  file should contain all commands to be processed and can even have
  some comments why you did something like you did it. Use any text
  editor for this and start DEMcut with an input redirection.


       demcut demfile1.dem demfile2.dem < commands.txt




  DEMcut starts, reads in all DEM files from the command line and reads
  the commands from the command file. All messages (every command pro-
  duces a message after completion) from DEMcut go to the screen or may
  be redirected to a logging file as well.



  demcut demfile1.dem demfile2.dem < commands.txt > output.log





  44..33..  IInntteerraaccttiivvee uussaaggee

  One of the best feature of DEMcut is the possibility to do an
  interactive analysis of DEM files. The interactive mode is not
  compiled in on systems without support for named pipes. It runs with
  Unix and Linux but not on MS-DOS, Win32 etc.

  I will describe now the Linux use.  First you have to create a named
  pipe in the directory where your Quake copy reads its DEM files from.


       mkfifo fifo.dem




  Now start Quake (make sure to use xquake and and not xf86quake) in a
  window as usual and playdemo this named pipe.


       playdemo fifo




  Quake tries now to read a demo out of fifo.dem but there is nothing to
  read in: it stops.

  Now comes the appearance of DEMcut. Open a new window and start DEMcut
  with the DEM file of your interest.


       demcut mydem.dem




  DEMcut reads in mydem.dem, does some preprocessing and waits for
  input. The first thing to do is to direct all output to the named
  pipe.


       o fifo.dem




  Now create the start of a normal DEM file with CD track and level ini-
  tialisation.


       c -1\n
       r 0 2




  It's unbelievable but Quake starts now the level and waits for further
  actions. Now play around with different ranges, speed tests or back-
  ward movements. Don't forget to put the disconnect frame at the end.
  Quake will usually play immediately what you intend but the Quake
  client time stands still after playing, so all the active sound
  patches will be repeated over and over and the Quake doesn't redraw
  its window.

  This is the point where the ``interactive mode'' comes in: DEMcut
  changes its behaviour with the command


       i 1




  This repeats the last frame sent to Quake but with an ongoing time.
  The interactive mode allows you to type in new commands during a range
  command.

  Now you can fast forward wind and rewind to find out all the frame
  numbers of interest. In another window you can now edit your cutting
  list batch file and run this file for cutting the final product.


  44..44..  CCoommmmaannddss

  There are not too many commands but they are very powerful.  The
  command language is line oriented: one line means one command.
  Comments start with `#', empty lines or lines with wrong commands will
  be ignored as well. DEMcut prints a short response after finishing a
  command to stdout.



  44..44..11..  HHeellpp


     SSyynnttaaxx::
        h

     DDeessccrriippttiioonn::
        DEMcut prints a _v_e_r_y short online help. If `i' (interactive
        mode) isn't listed, your operating system doesn't support named
        pipes and the interactive mode is left out.


  44..44..22..  OOuuttppuutt ffiillee


     SSyynnttaaxx::
        o filename

     DDeessccrriippttiioonn::
        Writes further output to this file. The old output file (if
        there was one) will be closed. If the output file can't be
        written (permission denied), DEMcut bombs back to the OS shell
        without any warning. I may do a check in the future.

     QQuueerryy ssyynnttaaxx::
        o

     DDeessccrriippttiioonn::
        Prints the current output file name.

     DDeeffaauulltt vvaalluuee::
        demcut.dem

  44..44..33..  DDEEMM ffiillee


     SSyynnttaaxx::
        d filename

     DDeessccrriippttiioonn
        Selects this DEM file as source.

     QQuueerryy ssyynnttaaxx::
        d

     DDeessccrriippttiioonn::
        Prints the current input DEM file name.

     VVaalluuee rraannggee::
        Any DEM file name. DEMcut generates an error, if the file is not
        a good DEM file.

     DDeeffaauulltt vvaalluuee::
        First DEM file from the command line. If there was no valid DEM
        file on the command line the d query command generates an error.


  44..44..44..  SSppeeeedd


     SSyynnttaaxx::
        s speed

     DDeessccrriippttiioonn::
        Speeds up all further output by this factor. speed>1 increases
        the play-back speed, speed<1 slows the play-back down.

     VVaalluuee rraannggee::
        speed may be any positive float value.

     QQuueerryy ssyynnttaaxx::
        s

     DDeessccrriippttiioonn::
        Prints the current speed.

     DDeeffaauulltt vvaalluuee::
        1.0


  44..44..55..  TTiimmee


     SSyynnttaaxx::
        t time

     DDeessccrriippttiioonn::
        Sets the current time.

     VVaalluuee rraannggee::
        time may be any positive float value.

     QQuueerryy ssyynnttaaxx::
        t

     DDeessccrriippttiioonn::
        Prints the current time.


     DDeeffaauulltt vvaalluuee::
        0.0


  44..44..66..  LLoooopp


     SSyynnttaaxx::
        l loop-count

     DDeessccrriippttiioonn::
        Sets the loop count. Every further frame will be written loop-
        count times to the output. The time goes forward as usual.

     VVaalluuee rraannggee::
        loop-count may be any positive integer value.

     QQuueerryy ssyynnttaaxx::
        l

     DDeessccrriippttiioonn::
        Prints the current loop count.

     DDeeffaauulltt vvaalluuee::
        1


  44..44..77..  CCDD ttrraacckk


     SSyynnttaaxx::
        c track

     DDeessccrriippttiioonn::
        Write the CD track string to the current output. If the CD track
        string doesn't end with whitespace  (`\t', `\r', `\n', `\f'), an
        `\n' will be silently appended. Don't forget this command at the
        beginning of every DEM file (like it happened with finesc5.dem
        of the Eschaton movie).

     QQuueerryy ssyynnttaaxx
        c

     DDeessccrriippttiioonn::
        Prints the current CD track string.

     DDeeffaauulltt vvaalluuee::
        -1\n


  44..44..88..  FFrraammee


     SSyynnttaaxx::
        f frame-number

     DDeessccrriippttiioonn::
        Writes the selected frame to the output. This frame gets the
        current time.  The time will be increased afterwards by the
        frame duration divided by the current speed. The whole process
        will be repeated as much as the current loop count states.

        The frame command stops in interactive mode a running range
        command.


     VVaalluuee rraannggee::
        frame-number can be any integer number between 0 and the maximum
        frame number in the currently selected DEM input file.

     QQuueerryy ssyynnttaaxx::
        f

     DDeessccrriippttiioonn::
        Prints the current frame number.

     DDeeffaauulltt vvaalluuee::
        0


  44..44..99..  RRaannggee


     SSyynnttaaxx::
        r range-start range-end

     DDeessccrriippttiioonn::
        Writes the selected range of frames to the output. Every frame
        gets the current time. The time will be increased after each
        frame by the frame duration divided by the current speed. Every
        frame will be repeated as much as the current loop count states.
        In interactive mode you can use any commands during a running
        range command (i.e. speed change). The range command can be
        stopped in interactive mode by a new range command or a frame
        command.

     VVaalluuee RRaannggee::
        range-start and range-end may be any integer number between 0
        and the maximum frame number in the currently selected DEM input
        file. range-end may even be smaller than range-start. If they
        are equal the result is the same as with the frame command.

     QQuueerryy ssyynnttaaxx::
        r

     DDeessccrriippttiioonn::
        Prints the current range.

     DDeeffaauulltt vvaalluuee::
        0, last frame number of the first DEM file from the command
        line.


  44..44..1100..  MMuullttii--ppllaayyeerr pprreeppaarriinngg


     SSyynnttaaxx::
        m multi-start multi-end

     DDeessccrriippttiioonn::
        Grabs out of the defined frame range all uuppddaatteennaammee and
        uuppddaatteeccoolloorrss messages and writes all these messages together
        with the camera angles of the last written frame to the output.
        It doesn't write anything if there was no uuppddaatteennaammee or
        uuppddaatteeccoolloorrss message in the defined frame range.

        Everyone, who ever tried to concatenate different multi-player
        DEM files knows the problem: The ``actors'' log in to the server
        in a different order and so they get every time different player
        numbers. If one tries to assemble all these files together one
        will end up with the wrong colour scheme because all players
        stick to the colour, number and name from the very first
        recording. The only solution is to insert the right name and
        colour definition of each part in the final product. And this
        does the ``m'' command.

     VVaalluuee RRaannggee::
        multi-start and multi-end may be any integer number between 0
        and the maximum frame number in the currently selected DEM input
        file. multi-end may even be smaller than multi-start.

     QQuueerryy ssyynnttaaxx::
        m

     DDeessccrriippttiioonn::
        Prints the current multi-player range.

     DDeeffaauulltt vvaalluuee::
        0, last frame number of the first DEM file from the command
        line.


  44..44..1111..  IInntteerraaccttiivvee mmooddee


     SSyynnttaaxx::
        i inter

     DDeessccrriippttiioonn::
        Toggles the interactive mode. The frame and the range command
        will be affected by the interactive mode. This command is not
        implemented on all systems.  Use the help command (`h') to find
        it out.

        DEMcut continues to write (under certain conditions) the last
        written frame with an ongoing time.  This feature is useful for
        an interactive use only (as the command name suggests). DEMcut
        remembers the (real) time, when the last frame written to Quake
        is finished. If up to this time came no new command (this is the
        normal case in interactive use) and the interactive mode is on,
        DEMcut writes the last frame again.  But the time stamp of this
        frame goes on and on. So Quake gets always new frames and
        doesn't stop. This is extremely important for users with many
        overlapping windows (like me): Quake refreshes its window in an
        normal working state only. It is very interesting to see what
        happens in the Quake window, if it gets always the same frame
        but the time goes on. This shows us the different sources of
        movement: particles (blood traces) are totally moved by the
        client (they continue to move ), gibs are frozen in the air
        (they are real entities) and the weapon moves up and down as
        usual (client driven).  DEMcut does not allow to repeat frames
        which change the signon number (frame 0, 1 or 2 of a normal DEM
        file). Neither does it repeat the ddiissccoonnnneecctt frame.

        The range command may be interrupted by other commands. You need
        this for looking at the current frame number (frame command
        without new frame number), for changing the current playback-
        speed etc. A new frame or range output command stops the running
        range command.


     VVaalluuee RRaannggee::
        0 (interactive mode off) or 1 (interactive mode on).

     QQuueerryy ssyynnttaaxx
        i


     DDeessccrriippttiioonn::
        Prints the current interactive mode.

     DDeeffaauulltt vvaalluuee::
        0


  44..44..1122..  QQuuiitt


     SSyynnttaaxx::
        q

     DDeessccrriippttiioonn::
        Closes the output file and quits DEMcut.


  44..55..  EExxaammppllee

  A very easy task is to create a DEM file, which shows with double
  speed the reversed actions of the well-known demo ``Ranger Gone Bad
  ][: The Assault'' (created by United Rangers Films).

  To do this start DEMcut with


       demcut rgb2.dem




  and type in (or much simpler use a text file and redirection)

  # this is a comment, I love comments
  # select the output
  o rgb2rev.dem
  # select the input (not really necessary)
  d rgb2.dem
  # speed things up
  s 2
  # write the CD track
  c -1\n
  # write the starting frames (level init is in 0,1 and 2)
  r 0 2
  # write all frames in reversed order (actions are in 3..7330)
  r 7330 3
  # write the disconnect frame (is the last one)
  f 7331
  # quit
  q

  This creates the new DEM file rgb2rev.dem with the desired content.


  44..66..  PPrroobblleemmss,, iiddeeaass aanndd eevveerryytthhiinngg

  The current implementation of DEMcut is full of deficiencies but
  anyway, it works.

  +o  The synchronisation between DEM output and the ``real'' time in the
     interactive mode is made using polling technique. It should be
     alarm(2) controlled.

  +o  I'm thinking about the possibility to incorporate the fake Quake
     server of DBS in DEMcut to remove the FIFO dependency.  Interactive
     work could then mean: fiddling at this server and a Quake client of
     any architecture serves as a monitoring screen (after connect to
     this server at the same or any other machine).

  +o  Please use a real OS for DEMcut. The preparing phase at the start
     of DEMcut for rgb2.dem takes at my P133 8 seconds with Linux but 17
     seconds with MS-DOS.

  +o  The Mingw32 (Win32 without cygwin.dll) version of DEMcut
     (demcutm.exe) may be totally broken. I never tested it and have no
     access to a Win32 system to check it. If someone really wants a
     working version for such a OS, please find the problem yourself.


  55..  DDBBSS,, TThhee DDeemmoo BBrrooaaddccaassttiinngg SSeerrvveerr


  55..11..  IInnttrroodduuccttiioonn

  DBS is a fake Quake server, which shows every connected client a DEM
  file.  This server is absolute alpha code.  It prints a hell of debug
  messages and doesn't know the full Quake network protocol. I think the
  name is crap and I will change it.  Please send me ideas.

  The source of DBS relies on some low-level Unix network routines.  I
  may get it to work in Win32 some day with the Cygwin API but don't
  expect a plain Win32 version.


  55..22..  CCoommmmaanndd lliinnee ppaarraammeetteerrss

  DBS is a command line oriented program. It uses the getopt_long
  library for the command line parsing. DBS doesn't stop for itself. Use
  Control+C to stop it.



  55..22..11..  SSyynnttaaxx ddeessccrriippttiioonn


     SSyynnttaaxx::
        dbs [--help|-h]

     DDeessccrriippttiioonn::
        If you start DBS without any command line parameters or the help
        parameters you receive the following syntax message:


          Demo Broadcasting Server
          DBS (c) U. Girlich, 1997-98, Release 3.2.8 6/3/1999 (bug fix release)
          dbs [option ...] demfile
          -h, --help                   display this help and exit.
          -v, --version                output version information and exit.
          -p, --port                   defines an UDP port for the server.
          -m, --max-player             defines the max. number of players.





  55..22..22..  VVeerrssiioonn


     SSyynnttaaxx::
        dbs (--version|-v)


     DDeessccrriippttiioonn::
        DBS prints a version message and quits.


  55..22..33..  PPoorrtt


     SSyynnttaaxx::
        dbs (--port|-p) PORT ...

     DDeessccrriippttiioonn::
        DBS uses by default the UDP port 26000 for the communication.
        This value can be overwritten with this option.


  55..22..44..  MMaaxxiimmuumm nnuummbbeerr ooff ppllaayyeerrss


     SSyynnttaaxx::
        dbs (--max-players|-m) MAX_PLAYERS ...

     DDeessccrriippttiioonn::
        DBS allows by default 16 players to connect and view the DEM
        file.  This value can be overwritten with this option. The
        internal limit for the number of players is 255 because the
        Quake Network protocol reserves only an unsigned char for the
        number of players.


  55..33..  WWhhaatt DDBBSS ddooeess

  Nowadays are so many fake clients out there but not a single fake
  server.  A proxy is not a real server because it is a client for
  another server.  So I decided to analyse the network protocol, learnt
  something about UDP programming and wrote my own server. I hope to
  include some parts of this server into DEMcut, a feature which lacks
  some GUI DEM file editors up to now.

  DBS mimics the behaviour of a normal Quake server. This means you can
  check the server with your favourite spy tool. The next step is to log
  in.  This works as usual (you get your private UDP port and so on) but
  DBS ignores all client movement packets and sends to the client only
  the converted DEM packets of a prepared DEM file.

  A small problem are the camera messages in the DEM packets.  They come
  into the DEM file at the client side and not from the server over the
  network. Therefore I included in every packet an additional setangle
  message with the current camera angles.

  This means, that you can't get the original DEM file by client (or
  proxy) recording.

  I hope to stabilise the server much more and think of a selection menu
  at the beginning where a client may select the DEM file (``channel'')
  of interest. I call it DoD (Demo on Demand).


  66..  DDMM22ccaatt,, TThhee DDMM22 ffiillee ccoonnccaatteennaattoorr

  DM2cat is a simple Perl script to concat multiple binary DM2 files
  together to a single multi-level DM2 file.

  It does this by simpy removing the last 4 bytes (the eennddbblloocckk) from
  each DM2 file.


  The main aim of DM2cat is to show a sample framework for any kind of
  binary DM2 file manipulation.


  77..  LLSS ffoorrmmaatt

  This chapter describes the ASCII text based source of a LMP or DMO
  file.  I created this language for myself. This means neither id
  Software nor 3D Realms use this for game development or the like. It
  is simply a way to show what is in these miraculous recording files.


  77..11..  IInnttrroodduuccttiioonn

  The LMP Source format (LS) is a (ASCII text based) readable
  description of the contents of a (binary) LMP or DMO file.

  LMPC produces (with --to-txt) a well formatted LS file. So you can
  learn by example.  I hope, that the text parser in LMPC (with --to-
  bin) can parse most LMP source. It can't parse DMO source files.

  +o  The LS language is a line oriented language.

  +o  Empty lines are ignored.

  +o  The keywords aren't case sensitive.

  +o  The characters between # and ``new line'' will be ignored.

  +o  ``new line'' can be 0x0A or 0x0D0A.

  At the very beginning of a LS file (produced by lmpc --to-txt) there
  are some comment lines with derived information:

     LLMMPP


          DOOM (][) LMP file:  filename of the LMP file
          Number of players:   derived from the number of used colours
          Total play time:     derived from the number of game tics
          Number of game tics: derived from the file length




     DDMMOO


          Duke Nukem 3D DMO file:  filename of the DMO file
          Total play time:         derived from the number of game tics
          Number of game tics:     taken from the header, it stays better in a comment





  77..22..  HHeeaaddeerr AArreeaa

  The Header Area starts with the keyword HeaderStart and ends with the
  keyword HeaderEnd.

  Between HeaderStart and HeaderEnd there are lines with general
  information about the LMP or DMO file:

     GGaammee::
        game type (DOOM, DOOM ][, HERETIC, HEXEN, STRIFE, Duke Nukem 3D,
        Redneck Rampage)

     VVeerrssiioonn::
        version number or version byte (new DOOM/DOOM ][, STRIFE) or 0
        (old DOOM/HERETIC/HEXEN), the real version for Duke Nukem 3D and
        Redneck Rampage

     SSkkiillll::
        player skill (LMP: 1-5, DMO: 1-4)

     EEppiissooddee::
        episode (DOOM/HERETIC/Duke Nukem 3D: 1-4, DOOM ][/HEXEN: 1, not
        in STRIFE), Redneck Rampage: 1 (I don't know it better yet,
        should be 1-4)

     MMaapp::
        starting map (DOOM/HERETIC/Duke Nukem 3D: 1-9, DOOM ][: 1-32,
        HEXEN 1-40, STRIFE: 32-??), Redneck Rampage: 1-11

  In multi-player LMP files comes now a table with the colours (0-3) of
  the players (0-3) (0-7 in STRIFE and HEXEN 1.1)


       Player0:      Colour of player 0
       Player1:      Colour of Player 1




  etc.

     PPllaayyeerr::
        Number of players (does exist in DMO source only)

  The following lines are special for new DOOM, DOOM ][ and STRIFE LMP
  files.

     MMuullttiiRRuullee::
        Multi-Player Playing Rule (Cooperative, DeathMatch or Altdeath)

     RReessppaawwnn::
        number (This line appears only if the LMP was recorded with
        -respawn. The number is the number of the command line parameter
        -respawn.)

     FFaasstt::
        number (This line appears only if the LMP was recorded with
        -fast. The number is the number of the command line parameter
        -fast.)

     NNooMMoonnsstteerrss::
        number (This line appears only if the LMP was recorded with
        -nomonsters. The number is the number of the command line
        parameter -nomonsters.)

     VViieewwOOffPPllaayyeerr::
        colour (The LMP is recorded from the view of the player with
        this colour, (0<=colour<=3))

  The following lines are special for new Duke Nukem 3D and Redneck Ram-
  page DMO files.

     MMuullttiiRRuullee::
        Multi-Player Playing Rule (DukeMatch (RedneckMatch) (with
        spawn), Coop, Dukematch (Redneckmatch) (without spawn))

     RReessppaawwnn MMoonnsstteerrss::
        number (This line appears only if the DMO file was recorded with
        /t1.)

     RReessppaawwnn IItteemmss::
        number (This line appears only if the DMO file was recorded with
        /t2.)

     RReessppaawwnn IInnvveennttoorryy::
        number (This line appears only if the DMO file was recorded with
        /t3.)

     NNooMMoonnsstteerrss::
        number (This line appears only if the DMO file was recorded with
        /m.)

  The following lines are special for Redneck Rampage DMO files.

     FFaakkeePPllaayyeerrAAII::
        number (This line appears only if the DMO was recorded with /a.)

     NNaammee::
        "string" (The standard name is "LEONARD" but it can be changed
        with the -name option.)

  Sometimes lmpc --to-txt can't distinguish between new DOOM and DOOM ][
  LMP files: In the Game line appears ``DOOM or DOOM ][''.

  The version byte can easily be derived from the game version.

              0 :    DOOM 1.1, 1.2
             101:    STRIFE 1.0, 1.1
             104:    DOOM 1.4beta
             105:    DOOM 1.5beta
             106:    DOOM 1.6beta, DOOM 1.666, DOOM ][ 1.666
             107:    DOOM ][ 1.7, DOOM ][ 1.7a
             108:    DOOM 1.8, DOOM ][ 1.8
             109:    (Ultimate) DOOM 1.9, DOOM ][ 1.9
             110:    published source code


                            LMP version bytes

  In HEXEN LMP files appears the player class (0: fighter, 1: cleric, 2:
  mage) too:


       Class:        single player class (0-2)




  or in multi-player LMP files:


       Class0:       player 0 class
       Class1:       player 1 class




  etc.




  77..33..  DDaattaa AArreeaa

  The Data Area starts with the keyword DataStart and ends with the
  keyword DataEnd.

  All actions of one game tic have to be in one text line. In a multi-
  player LMP there is one line for each player per game tic.

  LMPC may append (with the --mark-step option) a comment with the game
  tic and the time passed until this game tic at the line of the first
  player.


  77..33..11..  MMoovveemmeennttss

  A movement consists of a 2 letter word and an amount n.

          code    action               game     range
          GFn     Go Forward n        LMP      1<=n<=127
          GBn     Go Backward n       LMP      1<=n<=127
          SLn     Strafe Left n       LMP      1<=n<=127
          SRn     Strafe Right n      LMP      1<=n<=127
          GXn     Go X-direction n    DMO      -32768<=n<=32767
          GYn     Go Y-direction n    DMO      -32768<=n<=32767
          TLn     Turn Left n         LMP      1<=n<=127
          TLn     Turn Left n         DMO      1<=n<=32767
          TRn     Turn Right n        LMP      1<=n<=127
          TRn     Turn Right n        DMO      1<=n<=32767


                            Movement commands


  77..33..22..  UUssee ((LLMMPP oonnllyy))


         UT     Use Thing (press button, open door etc.)
         NWn    New Weapon (1<=n<=8) (change the weapon manually)
         FW     Fire Weapon

         PS     Pause Start
         PE     Pause End
         SGn    Save Game in slot n (0<=n<=7)


                               Use commands

  You can not combine PS, PE and SG with other Use commands. But you can
  combine the other Use commands (for instance UT and FW at the same
  time).


  77..33..33..  FFllyy aanndd LLooookk ((HHEERREETTIICC aanndd HHEEXXEENN oonnllyy))

  A fly and look command consists of a 2 letter word and an amount
  (1<=n<=15)


  77..33..44..  UUssee AArrttiiffaacctt ((HHEERREETTIICC aanndd HHEEXXEENN oonnllyy))

  The Use Artifact command consist of the code AT and a letter (a..j)
  equivalent to the gimme-cheat of HERETIC. In HEXEN such a cheat code
  does not exist but the command remains the same:




                    FUn    Fly Up n
                    FDn    Fly Down n
                    LUn    Look Up n
                    LDn    Look Down n

                    FC     Fly Centre (landing, drop)
                    LC     Look Centre (look forward)


                          Fly and Look commands
     HHEERREETTIICC::

                     ATa    ring of invincibility
                     ATb    shadowsphere
                     ATc    quartz flask
                     ATd    chaos device
                     ATe    tome of power
                     ATf    torch
                     ATg    time bomb of the ancients
                     ATh    morph ovum
                     ATi    wings of wrath
                     ATj    mystic urn


                            HERETIC artifacts

     HHEEXXEENN::

                      ATa    icon of the defender
                      ATb    quartz flask
                      ATc    mystic urn
                      ATd    clerical healing key
                      ATe    dark servant
                      ATf    torch
                      ATg    porkalator
                      ATh    wings of wrath
                      ATi    chaos device
                      ATj    flechette
                      ATk    banishment device
                      ATl    boots of speed
                      ATm    krater of might
                      ATn    dragonskin bracers
                      ATo    disc of repulsion
                      UA     use all (panic button)


                             HEXEN artifacts


  77..33..55..  SSTTRRIIFFEE AArrttiiffaaccttss

  You can only the use STRIFE artifacts with the IN or DR actions.

  The Use Artifact command consist of the code A and an artifact number.
  Up to now I know only 12 artifacts.


  77..33..66..  JJuummpp ((HHEEXXEENN aanndd SSTTRRIIFFEE oonnllyy))

  In HEXEN and STRIFE you can jump up.






                      code    name
                      0x74    toughness
                      0x75    accuracy
                      0x76    full health
                      0x7B    teleportor beacon
                      0x7C    metal armor
                      0x7D    leather armor
                      0xA1    med patch
                      0xA2    medical kit
                      0xA3    coin
                      0xA7    shadow armor
                      0xA8    environmental suit
                      0xB7    offering chalice


                             STRIFE artifacts

                                JU    jump


                               Jump command
  77..33..77..  SSTTRRIIFFEE aaccttiioonnss

  There are some more STRIFE actions. Remember: no talks are stored in
  the LMP file.

                      LU    Look Up
                      LD    Look Down
                      RU    Run
                      IN    Use Inventory
                      DR    Drop Inventory
                      JU    Jump Up
                      U6    Unknown Action Number 6
                      HE    Use Health


                              STRIFE actions


  77..33..88..  UUssee ((DDMMOO oonnllyy))

  There are 28 actions in DMO files (and 4 bits for weapon change).  As
  far as it works I use the same codes for the same or similar thing as
  in LMP sources. To describe the actions I use the terms for key
  definitions in DUKE3D.CFG.


  77..33..99..  SSppeecciiaall CCooddeess


                  WT    Wait a Tic
                  *n    Repeats the current line n times


                             Special commands


  88..  DDEEMM ssoouurrccee ffoorrmmaatt

  The DEM format is very complicated. Therefore I don't include a
  documentation of the text format here. Please look in the ``Unofficial
  DEM format description''.  The current version is available at
  <http://www.planetquake.com/demospecs/dem>.



        JU      Jump
        CR      Crouch
        FW      Fire
        AU      Aim_Up
        AD      Aim_Down
        RU      Run
        LU      Look_Up
        LD      Look_Down
        VI      NightVision
        MK      MedKit
        AR      AutoRun
        LC      Center_View
        HW      Holster_Weapon
        IL      Inventory_Left
        HD      Holo_Duke
        JP      Jetpack
        IR      Inventory_Right
        TA      TurnAround
        UT      Open
        IN      Inventory
        AC6     ??
        AC7     ??
        AC12    ??
        PA      Pause
        AC22    ??
        AC23    ??
        AC26    ??
        AC31    ??
        NWn     New Weapon (1<=n<=10) (change the weapon manually)


                               DMO actions
  You will understand my textual representation of the DEM format by
  inspecting a sample file and reading a bit about the structure in the
  mentioned document.

  If someone is willing to write a documentation of my DEM text format
  please inform me and your document will be included right here. For
  the die-hard hacker: the lex file udeml.l and the yacc file udemy.y
  contain the complete language grammar documentation.


  99..  QQWWDD ssoouurrccee ffoorrmmaatt

  The QWD format is even harder to understand than the DEM format.
  Please look in the ``Unofficial QWD format description''.  The current
  version is <http://www.planetquake.com/demospecs/qwd>.

  You will understand my textual representation of the QWD format by
  inspecting a sample file and reading a bit about the structure in the
  mentioned document.

  If someone is willing to write a documentation of my QWD text format
  please inform me and your document will be included right here.


  1100..  DDMM22 ssoouurrccee ffoorrmmaatt

  The DM2 format is a nice and compact file format.  Please look in the
  ``Unofficial DM2 format description''.  The current version is
  <http://www.planetquake.com/demospecs/dm2>.

  You will understand my textual representation of the DM2 format by
  inspecting a sample file and reading a bit about the structure in the
  mentioned document.
  If someone is willing to write a documentation of my DM2 text format
  please inform me and your document will be included right here.


  1111..  MMoorree ttoooollss aanndd iinnffoorrmmaattiioonn

  For further information on LMP files look in the ``Unofficial LMP
  format description''. The current version is
  <http://www.planetquake.com/demospecs/lmp>.

  For further information on DMO files look in the ``Unofficial DMO
  format description''. The current version is
  <http://www.planetquake.com/demospecs/dmo>.

  For further information on DEM files look in the ``Unofficial DEM
  format description''. The current version is
  <http://www.planetquake.com/demospecs/dem>.

  For further information on QWD files look in the ``Unofficial QWD
  format description''. The current version is
  <http://www.planetquake.com/demospecs/qwd>.

  For further information on DM2 files look in the ``Unofficial DM2
  format description''. The current version is
  <http://www.planetquake.com/demospecs/dm2>.

  A DEM file editing guide can be found at
  <http://www.planetquake.com/qsep/movies.html>.

  There do exist some DEM file manipulation tools from other authors.
  Find them in Slipgate Central <http://www.slipgatecentral.com>.

  A DM2 file editing tutorial can be found at
  <http://www.planetquake.com/zs/tutor.htm>.


  1122..  HHiissttoorryy aanndd ffuuttuurree ooff LLMMPPCC

  LMPC started in the good old DOOM days as a very small Turbo Pascal
  6.0 program to show me what's in these LMP files. It is now a ``fat''
  C application and has way too many command-line switches.  DEMcut is
  not as widely used as LMPC but it started the DEM editing hype. DBS (I
  really have to change this name) gave the Keygrip authors (
  <http://www.planetquake.com/keygrip>) the starting point for their
  internal fake Quake server.



     11..00 ((88//3300//11999944)) lmpc10.zip (8/31/1994 posted in
        alt.binaries.doom, alt.games.doom)"

     +o  General: first public version.


     11..0011 ((88//3311//11999944)) lmpc101.arj (9/1/1994 posted in
        alt.binaries.doom, alt.games.doom)"

     +o  LMP: bug fixed in WT statistics.

     +o  Docu: LS description / LMPC program reference splitted in LS.DOC
        / LMPC.DOC.

     +o  LMP: New heuristic algorithm to discover former version changes.

     +o  Docu: History added in LMPC.DOC.

     +o  General: Terry (terry@usis.com) wrote also a DOOM utility (I
        don't know it) with the archive name lmpc10.zip. Therefore I
        changed to the ARJ archive.


     22..00 ((1100//1111//11999944)) lmpc20.arj (internal beta test release)

     +o  LMP: the LMP compiler is ready after all!


     22..0011 ((1100//1122//11999944)) lmpc201.arj (internal beta test release)

     +o  LMP: decompiler bug fixed (UT/FW and NW in the same game tic).

     +o  LMP: compiler parser improved (token length test).

     +o  LMP: NW8 (8 gives you the chain saw directly) added.


     22..11 ((1100//2244//11999944)) lmpc21.arj (10/25/1994 posted in
        alt.binaries.doom)"

     +o  General: after a error free beta test phase nothing changed, new
        public version.


     22..2200 ...... 22..2266 ((nneevveerr ppuubblliisshheedd))

     +o  General: rewritten from scratch (Turbo Pascal 6.0 -> ANSI C).


     22..2277 ((22//2255//11999955)) lmpc-2.27.tar.gz (internal beta test release)

     +o  LMP: LS format improved (new HERETIC movements).

     +o  LMP: can handle DOOM ][ and HERETIC LMP files.

     +o  LMP: GAME-token in the LS Header.

     +o  LMP: version change expects now the real version byte.

     +o  LMP: 1.5 times faster (2.27/2.1, checked with a >300K LMP).

     +o  General: includes now an executable for MS-DOS and Linux.


     22..33 ((44//2299//11999955)) lmpc-2.3.tar.gz/lmpc23.zip

     +o  General: full source code included.

     +o  LMP: version change expects a real version string or the version
        byte.

     +o  General: zip and tar.gz release.

     +o  General: includes now go32.exe and stub.exe too.


     22..44 ((88//77//11999955)) lmpc-2.4.tar.gz/lmpc24.zip
        (public release)"

     +o  General: MS-DOS binary cross compiled with go32crs.

     +o  Docu: documentation in HTML and plain text (created with Mosaic
        from the HTML version).

     +o  LMP: Ultimate DOOM with 4th episode tested (nothing changed).


     22..55 ((88//2233//11999955)) lmpc-2.5.tar.gz/lmpc25.zip
        (internal beta test release)"

     +o  General: command line parsing now with getopt_long and long
        option names are allowed too.

     +o  General: to compile lmpc.exe (MS-DOS binary) I included the
        getopt-package from the GNU C library (my copy of djgpp doesn't
        include getopt).

     +o  General: --info can handle many files on the command line.

     +o  LMP: --lmp-to-ls can decompile a specific part of the LMP file
        (the new --tic option).

     +o  LMP: the buggy version number string function repaired.

     +o  LMP: the new option --game to force the game type of the LMP
        file.


     22..66 ((88//2266//11999955)) lmpc-2.6.tar.gz/lmpc26.zip
        (internal beta test release)"

     +o  LMP: --ls-to-lmp converts now several LS files to a LMP file.

     +o  LMP: new option --add-WT to add WT at the end of a LMP file.


     22..66..11 ((88//2288//11999955)) lmpc-2.6.1.tar.gz/lmpc261.zip
        (internal beta release)"

     +o  General: 3 parts of the version number.

     +o  LMP: --gametic FROM(,|:)TO: colon is allowed as a separator too.

     +o  LMP: --ls-to-lmp keeps track of PS and PE.

     +o  LMP: --remove-pause to remove the Pause game tics.


     22..77..00 ((99//33//11999955)) lmpc-2.7.0.tar.gz (internal alpha release)

     +o  LMP: --gametic changed to --tic

     +o  LMP: total new code to convert LMP files (all in one).

     +o  LMP: do multiple LMP file changes at the same time.

     +o  LMP: convert LMP files with the help of a temporary file (if
        necessary).


     22..77..11 ((99//55//11999955)) lmpc-2.7.1.tar.gz/lmpc271.zip
        (internal beta release)"

     +o  LMP: small bug fixes in the new code.

     +o  LMP: MS-DOS binary converts now all filenames to lower case.


     22..77..22 ((99//66//11999955)) lmpc-2.7.2.tar.gz/lmpc272.zip
        (internal beta release)"
     +o  LMP: small bug in the MS-DOS binary corrected.


     22..88..00 ((1100//55//11999955)) lmpc-2.8.0.tar.gz/lmpc280.zip
        (public release)"

     +o  General: Nothing important changed after one month of intensive
        beta testing. The code is stable.


     22..99..11 ((1100//99//11999955)) lmpc-2.9.1.tar.gz/lmpc291.zip
        (internal beta release)"

     +o  General: from now on I use a version number scheme similar to
        Linux: second number odd means test.

     +o  LMP: HEXEN support (rudimentary).


     22..99..22 ((1100//99//11999955)) lmpc-2.9.2.tar.gz/lmpc292.zip
        (internal beta release)"

     +o  LMP: correct names of all HEXEN artifacts.


     22..99..33 ((1111//1199//11999955)) lmpc-2.9.3.tar.gz/lmpc293.zip
        (internal beta release)"

     +o  LMP: new option --clear-save to clear the SG tics.

     +o  Docu: documentation in Linux-SGML.

     +o  LMP: small multi-player bug corrected, thanks to Rob McCartney
        (argon@netcom.com) for his bug report.


     22..99..44 ((1122//66//11999955)) lmpc-2.9.4.tar.gz/lmpc294.zip
        (internal beta release)"

     +o  new option --mark-step to mark only every STEPth game tic

     +o  General: MS-DOS version uses CR/LF instead of LF for LS files.


     22..99..55 ((22//1100//11999966)) lmpc-2.9.5.tar.gz/lmpc295.zip
        (internal alpha release)"

     +o  DMO: rudimentary support for Duke Nukem 3D DMO files (alpha
        code!).


     22..99..66 ((22//1122//11999966)) lmpc-2.9.6.tar.gz/lmpc296.zip
        (internal alpha release)"

     +o  DMO: reliable version of lzw.c/unlzw.c included.

     +o  DMO: all DMO header bytes decoded.

     +o  General: new WWW directory structure.


     22..99..77 ((22//1133//11999966)) lmpc-2.9.7.tar.gz/lmpc297.zip
        (internal beta release)"

     +o  DMO: version 1.1 of lzw.c/unlzw.c included.

     +o  DMO: DMO support in -s and -i.

     +o  Docu: documentation structure changed.


     22..99..88 ((22//1199//11999966)) lmpc-2.9.8.tar.gz/lmpc298.zip
        (internal beta release)"

     +o  DMO: Chunk header removed from DS format.

     +o  DMO: multi-player size/tics/time corrected.

     +o  DMO: Pause is AC21.


     22..99..99 ((33//66//11999966)) lmpc-2.9.9.tar.gz/lmpc299.zip
        (internal beta release)"

     +o  LMP: STRIFE support included.


     22..99..1100 ((44//77//11999966)) lmpc-2.9.10.tar.gz/lmpc2910.zip
        (internal beta release)"

     +o  LMP: HEXEN 1.1 (8 player) support included.

     +o  LMP: considerable changes in the -g code.


     22..99..1111 ((44//1144//11999966)) lmpc-2.9.11.tar.gz/lmpc2911.zip
        (internal bug fix release)"

     +o  LMP: version string scan routine improved (buggy since 2.9.9).

     +o  LMP: game type determine routine corrected (buggy since 2.9.10).

     +o  LMP: HEXEN version change (1.0 <-> 1.1) now possible.


     22..99..1122 ((44//2211//11999966)) lmpc-2.9.12.tar.gz/lmpc2912.zip
        (internal beta release)"

     +o  DMO: macro-block error fixed.

     +o  LMP: STRIFE player colour names included.


     22..99..1133 ((77//11//11999966)),, nneevveerr rreelleeaasseedd
        (internal incomplete alpha release)"

     +o  DEM: coding started for Quake DEM files, nothing completed.


     22..99..1144 ((77//22//11999966)),, nneevveerr rreelleeaasseedd
        (internal incomplete alpha release)"

     +o  Quake DEM files: coding continued, something completed.


     22..99..1155 ((77//33//11999966)),, nneevveerr rreelleeaasseedd
        (internal incomplete alpha release)"

     +o  DEM: coding continued, structure mostly completed.

     +o  General: new recursive Makefiles, MS-DOS compiling not supported
        anymore.
     +o  General: new Linuxdoc-SGML 1.5 options.

     +o  General: Linux binary is ELF finally.

     +o  General: MS-DOS binary is djgpp V2.0 compatible (and runs in
        dosemu).


     22..99..1166 ((77//44//11999966)),, nneevveerr rreelleeaasseedd
        (internal incomplete alpha release)"

     +o  DEM: CD track identified.

     +o  DEM: player movement identified.


     22..99..1177 ((77//77//11999966)),, lmpc-2.9.17.tar.gz/lmpc2917.zip
        (beta release)"

     +o  DEM: cross reference to DEM specs.

     +o  DEM: clientdata with more information.

     +o  DEM: entities: ModNum with reference to the model names.


     22..99..1188 ((77//88//11999966)),, lmpc-2.9.18.tar.gz/lmpc2918.zip
        (beta release)"

     +o  DEM: stupid spawnstatic error corrected.

     +o  DEM: code beautified.


     22..99..1199 ((77//1144//11999966)),, lmpc-2.9.19.tar.gz/lmpc2919.zip
        (beta release)"

     +o  DEM: many new values explained.

     +o  DEM: strings can contain unprintable characters.


     22..99..2200 ((77//1177//11999966)),, lmpc-2.9.20.tar.gz/lmpc2920.zip
        (beta release)"

     +o  DEM: some new values explained.

     +o  DEM: code rearranged.

     +o  DEM: corresponds (more or less) to dem-0.0.5.


     22..99..2211 ((77//2233//11999966)),, lmpc-2.9.21.tar.gz/lmpc2921.zip
        (beta release)"

     +o  DEM: some new values explained.

     +o  DEM: massive code rearrangements.


     22..99..2222 ((88//77//11999966)),, lmpc-2.9.22.tar.gz/lmpc2922.zip
        (beta release)"

     +o  DEM: almost all explained.


     +o  DEM: text file parser is ready (lex, yacc), first check.

     +o  DEM: -s may now decompile a DEM txt file to a DEM txt file.

     +o  DEM: massive code rearrangements.


     22..99..2233 ((88//1144//11999966)),, lmpc-2.9.23.tar.gz/lmpc2923.zip
        (beta release)"

     +o  DEM: the ``to bin converter'' is ready. Not very stable.

     +o  General: all messages (not getopt) go to stderr.

     +o  DEM: write to - means stdout.

     +o  General: new command line options: --to-txt and --to-bin

     +o  Docu: some terms changed.


     22..99..2244 ((1100//66//11999966)),, lmpc-2.9.24.tar.gz/lmpc2924.zip
        (beta release)"

     +o  DEM: all float output (time inclusive) with g-format (9 digits).

     +o  DEM: more internal errors corrected.


     22..99..2255 ((1100//1133//11999966)),, lmpc-2.9.25.tar.gz/lmpc2925.zip
        (beta release)"

     +o  DEM: memory problem solved: LMPC needs now only 400-500K RAM.

     +o  Docu: version table reorganised, README, INSTALL slightly
        changed.

     +o  Makefiles: new targets, easier to make packages and my web-page.

     +o  DEMA: first working version.


     22..99..2266 ((1111//1177//11999966)),, lmpc-2.9.26.tar.gz/lmpc2926.zip
        (bug fix release)"

     +o  DEM: MS-DOS binary can read in DEM text files.

     +o  DEM: attack_state->effects, ang_ofs_1->punchangle_x.

     +o  LMP: MS-DOS binary prints now the correct statistics.

     +o  General: new E-mail address.


     22..99..2277 ((1111//2200//11999966)),, lmpc-2.9.27.tar.gz/lmpc2927.zip
        (public beta release)"

     +o  General: many thanks to Eric Gordon Fowler
        (efowler@jove.acs.unt.edu) and Paolo Perrotta
        (nan0744@iperbole.bologna.it) for all their bug reports.

     +o  DEM: string in and out handles special characters better (not
        perfect).

     +o  DEM: text parser allows digits after an octal escape sequence.

     +o  DEM: \n, \r, \\ and \" are allowed character escape sequences in
        DEM text files.

     +o  DEM: binary file read is byte-order independent (unchecked).

     +o  DEM: binary file write is byte-order independent (unchecked).

     +o  DEM: float numbers may contain exponents.

     +o  DEM: updateentity with an entity > 255 works.

     +o  General: my code survives -Wall -pedantic without warnings.

     +o  Docu: Old LMPC history a bit reformatted.


     22..99..2288 ((1111//3300//11999966)),, lmpc-2.9.28.tar.gz/lmpc2928.zip
        (public beta release)"

     +o  DEM: put an items entry in binary DEM files even if it is 0.
        This modification enables an error-free decompile/compile of
        CAMPER3.DEM by ``United Rangers Films'' after all.


     22..99..2299 ((1122//1155//11999966)),, lmpc-2.9.29.tar.gz/lmpc2929.zip
        (public beta release)"

     +o  DEM: --info detects DEM text files.

     +o  DEM: binary file read reorganised (coding just started).

     +o  DEMcut: coding started. First working version.


     22..99..3300 ((11//55//11999977)),, lmpc-2.9.30.tar.gz/lmpc2930.zip
        (alpha test release)"

     +o  DEM: binary file read totally rewritten. I use now for binary
        files the same internal node tree representation as for text
        files. The text output part is a bit slower now but the whole
        project is much easier to maintain.

     +o  DEM: --to-bin can handle binary DEM files too. It should create
        an identically copy of the input file (if I didn't make any
        mistakes).

     +o  DEM: binary write: last (I hope so) endian-dependence removed.

     +o  DEM: binary write: suppresses ``camera only'' blocks.

     +o  DEM: text write: suppresses ``camera only'' blocks.

     +o  DEM: text write: stops at file write errors (e.g. device full).

     +o  DEMcut: almost all new coded. The interface remains identical.
        I can now include very easy new commands.

     +o  DEMcut: the time message can be anywhere in a block.

     +o  DEMcut: new ``m'' command to prepare multi-player DEM file
        concatenations.

     +o  DEMcut: new ``i'' command to improve the interactive work: range
        may be interrupted, output is time-synchronised.


     +o  Docu: Formatted with SGML-Tools 0.99.0.

     +o  General: Orthographical check with ispell (British English).


     22..99..3311 ((11//77//11999977)),, lmpc-2.9.31.tar.gz/lmpc2931.zip
        (bug fix release)"

     +o  DEM: text write: CD track was never printed: totally stupid bug.


     22..99..3322 ((22//99//11999977)) ((aallpphhaa tteesstt rreelleeaassee))

     +o  DEMcut: more info on running ranges in interactive mode.

     +o  DEMcut: ``d'' command don't need files from the command line.

     +o  General: includes executables for Win32 (untested).

     +o  General: new packaging system.

     +o  General: all messages go to stderr.


     22..99..3333 ((22//1166//11999977)) ((aallpphhaa tteesstt rreelleeaassee))

     +o  DMO: Redneck Rampage support started. Info works, decompression
        not.

     +o  DMO: Duke Nukem 3D 1.3D DMO files supported. This incompatible
        version exists since April 1996 but nobody said it to me.

     +o  DMO: endian-dependence should be removed. Never checked this.


     22..99..3344 ((33//2233//11999977)) ((bbeettaa tteesstt rreelleeaassee))

     +o  DEM: --info prints the number of game tics (or frames) for
        binary DEM files.

     +o  DEM: new option --fix-multi for in-place editing.

     +o  DEM: new option --fix-multi as additional option for --to-bin
        and --to-txt.

     +o  DEM: bin read: type check was endian-dependent (no longer).

     +o  DEM: bin read: CD track at the beginning can be anything, that
        Quake itself likes. Read the DEM specs (>=1.0.4) for details.
        The full CD track string will be included in a DEM text file but
        LMPC can cope with the old format as well.

     +o  DEMcut: CD track commands expects the `\n' character as well.
        The old syntax continues to work.

     +o  Docu: Demolition and DemoStat mentioned.


     33..00..00 ((33//3311//11999977)) ((ppuubblliicc bbeettaa rreelleeaassee))

     +o  DEM: text read: hours in time stamps didn't work (bug report by
        James Stephenson (james@BETAus.com)).

     +o  DEMcut: CD track command works now correctly.


     +o  --game option repaired.

     +o  Docu: general clean-up.


     33..00..11 ((55//1155//11999977)) ((ppuubblliicc rreelleeaassee))

     +o  General: text write: Win32 versions make MS-DOS style line
        breaks (hint by David Wright (wgwright@mnsinc.com)).

     +o  General: Minimalist GNU Win32 (Mingw32) version ready
        (untested).

     +o  Win32: The syserror function was always broken. Why didn't
        somebody give me a hint?

     +o  DEM: bin read: `new' (version > 1.06) DEM format.

     +o  DEM: bin write: stupid error in cclliieennttddaattaa removed.  It was
        there since 2.9.23 (hint by Yonatan Donner
        (ruthd@post.tau.ac.il)).

     +o  DEM: entry clientdata->weapon may contain invalid values (more
        than 1 bit set).

     +o  Packaging: Win32 versions with standard file names. Only the
        `MS-DOS Binary Package' use the short 8.3 name scheme.


     33..11..11 ((77//2200//11999977)) ((iinntteerrnnaall aallpphhaa tteesstt rreelleeaassee))

     +o  QWD: bin read: coding started. Nothing completed.

     +o  Docu: all tables now floating in TeX.

     +o  Conf: all is now Autoconf configured.


     33..11..22 ((77//2288//11999977)) ((aallpphhaa tteesstt rreelleeaassee))

     +o  DEMcut: interactive mode is removed in systems without named
        pipes.

     +o  DBS: alpha code.

     +o  Conf: Autoconf rules newly written. Really everything is
        Autoconf configured.

     +o  Docu: DBS mentioned.

     +o  Docu: rename INSTALL in COMPILE.

     +o  Docu: new file: Autoconf generic INSTALL.


     33..11..33 ((88//1177//11999977)) ((aallpphhaa tteesstt rreelleeaassee))

     +o  General: package renamed: LMP/DMO/DEM/QWD Control Centre ->
        Little Movie Processing Centre

     +o  QWD: QuakeWorld 2.00 support included.

     +o  Docu: back again to SGML-Tools 0.99.0.

     +o  Docu: chapters restructured.

     33..11..44 ((1122//2299//11999977)) ((aallpphhaa tteesstt rreelleeaassee))

     +o  Conf: Makefile.in created from Makefile.am by GNU Automake. Much
        easier to maintain!

     +o  General: Hexen II support just started. Not complete. Can't even
        decompile correctly a single file.

     +o  Compile: some general routines in a library.

     +o  General: Quake II support just started. Not complete. Can't even
        decompile deltapacketentities.


     33..11..55 ((11//11//11999988)) ((aallpphhaa tteesstt rreelleeaassee))

     +o  DM2: text output: many comments included.

     +o  Docu: SGML-Tools 1.0.2 ready after all.

     +o  Conf: Automake 1.2 compliant. Some yacc/lex changes were needed.


     33..11..66 ((33//1122//11999988)) ((aallpphhaa tteesstt rreelleeaassee))

     +o  DM2: binary read: nasty malloc/free bug removed.

     +o  DM2: some new commands got better names.

     +o  DEM: binary read: CD track totally rewritten.

     +o  LMP: can handle -v1.10 (for the released DOOM source code
        distribution)

     +o  Web: PlanetQuake is the new home.

     +o  Docu: SGML-Tools 1.0.5 used.


     33..11..77 ((66//1177//11999988)) ((aallpphhaa tteesstt rreelleeaassee))

     +o  DBS: subtle sync problem solved. Thanks to Paul Baker
        (pbaker@idle.com) for his bug report.

     +o  DM2: text in: parser implemented.

     +o  DM2: some command names changed.

     +o  DM2: binary out: implementation started.


     33..11..88 ((77//1155//11999988)) ((iinntteerrmmeeddiiaattee bbeettaa rreelleeaassee))

     +o  DM2: server record files implemented.

     +o  Conf: dist target for source package is working now.

     +o  Conf: more checks for more platforms.

     +o  Docu: SGML-Tools 1.0.7 used.

     +o  QWD: binary in: up to QuakeWorld 2.29BETA.


     33..11..99 ((88//1166//11999988)) ((bbeettaa rreelleeaassee))

     +o  QWD: text in: written.

     +o  QWD: binary out: written. Due to the ongoing demand by many
        users I implemented now the QWD binary write routine. This gives
        together with the text read routine the first really working QWD
        editor.

     +o  DM2: Visual Weapon (VWep) support.

     +o  DM2: some really bad errors corrected.

     +o  Conf: After many fights with the Automake system, `make
        distcheck' works finally without problems.


     33..22..00 ((99//66//11999988)) ((ssttaabbllee rreelleeaassee))

     +o  DM2: binary read and binary write: long vwep corrected. Now
        works massive1.dm2.

     +o  DM2: binary write: timeofs in ssoouunndd wasn't even implemented.

     +o  DM2: text read: allows now empty ppaacckkeetteennttiittiieess. Many users
        reported this problem in reease 3.1.9. Thanks to all of you.

     +o  QWD: text read: allows now empty ppaacckkeetteennttiittiieess like in DM2 text
        read.

     +o  text read: useless terminals removed.

     +o  DM2: unused bits in bit mask (ssoouunndd, ssppaawwnnbbaasseelliinnee,
        ppaacckkeetteennttiittiieess) detected. It's a real mess that Keygrip 2 set
        unused bits in DM2 files but I implemeted an easy way to cope
        with it.  Now works latenite.dm2.

     +o  DM2: text read: allows now empty ppllaayyeerriinnffoo. Now works
        grenbfg.dm2.

     +o  DEM: Hexen II support (it was always only a small subset)
        totally removed.


     33..22..11 ((99//88//11999988)) ((ssttaabbllee rreelleeaassee))

     +o  DEM: text write: didn't write the CD track. A stupid integration
        error. I know, I actually have to make a software quality test
        with all my test demos before the upload.

     +o  DEM: to text: problems with --game QUAKE switch. Not really
        solved. Just a kludge inserted, which even slows the program
        down a bit.


     33..22..22 ((11//99//11999999)) ((ppuubblliicc rreelleeaassee))

     +o  QWD: bin read: protocol version 27 (game version 2.29BETA and
        up) corrected.

     +o  QWD: read text: many small but important parsing problems
        removed. This was possible because Joel Baxter
        (jbaxter@lemur.stanford.edu) provided me with a problematic QWD
        file (recorded with game version 2.21) and many good hints.

     +o  QWD: uuppddaatteeppll better.


     +o  DM2: updated up to game version 3.20.

     +o  DM2: bin read: tteemmpp__eennttiittyy parse code directly calculated from
        the DM2 specs.

     +o  Docu: SGML-Tools 1.0.9 used.

     +o  Compile: Cygwin and Mingw32 binaries are cross-compiled with the
        Cygwin toolset version B20.1.

     +o  DM2cat: The DM2 file concatenator included.


     33..22..33 ((11//1122//11999999)) ((ppuubblliicc rreelleeaassee))

     +o  Compile: udm2-te[123].c are created directly in the source
        directory.

     +o  Package: udm2-te[123].c are included in the source and full
        package.  I forgot them in the last release. Thanks to Stefan
        Schwoon (schwoon@informatik.tu-muenchen.de) for mention this
        error.

     +o  The script to extract the C-Source out of the specs file is
        included too.

     +o  WWW: upload script uploads now the packages to the right place
        to deliver them to all  <http://www.cdrom.com> mirrors. In the
        last release this was totally wrong.


     33..22..44 ((11//1199//11999999)) ((ppuubblliicc rreelleeaassee))

     +o  QWD: bin read: new sseerrvveerriinnffoo message wrong handled.  Thanks to
        Michale Hofele (michael@i603.hadiko.de) for the bug-report.


     33..22..55 ((44//66//11999999)) ((ppuubblliicc rreelleeaassee))

     +o  Conf: Autoconf 2.13 and Automake 1.4 used.

     +o  DEMcut: interactive mode corrected. Thanks to Vasily Kuznetsov
        (VKuznetsov@microtest.ru) for the bug-report and patch.

     +o  QWD: bin read: sseettppaauussee corrected.  Thanks to Christer Sandin
        (czsuch@ocag.ch) for his bug report.

     +o  DM2: multi-level repair corrected. Thanks to Zerox
        (zerox@prism.ne.mediaone.net) for the bug-report and a short
        demo file.


     33..22..66 ((44//3300//11999999)) ((ppuubblliicc rreelleeaassee))

     +o  QWD: bin read: initialization of the precache lists for game
        version 2.20 and higher corrected.

     +o  QWD: mmaaxxssppeeeedd and eennttggrraavviittyy corrected.

     +o  Thanks to R. Quaak (jaqua00@direct.a2000.nl) for the _u_s_e_f_u_l bug
        report and a short demo file.  Remember: with a good bug report
        and a short demo file, I can correct a bug really fast.


     33..22..77 ((55//2244//11999999)) ((bbuugg ffiixx rreelleeaassee))

     +o  Compile: source can be compiled with C++ compilers too. No C++
        specific feature used up to now. Many new C++ related warnings
        corrected.

     +o  General: severe buffer overflow problems corrected.  Thanks to
        Nathan Whitaker (naif@3dcoder.freeserve.co.uk) for the bug
        report and a demo file.

     +o  Compile: Linux binaries are glibc finally. I updated my main
        development system from SuSE Linux 4.2 (about 4 years old) to
        SuSE Linux 6.1 to do this.


     33..22..88 ((66//33//11999999)) ((bbuugg ffiixx rreelleeaassee))

     +o  QWD: mmooddeelllliisstt and ssoouunnddlliisstt corrected.  Thanks to Hoffy
        (ripple@powerup.com.au) for the bug report and a demo file.



  Plan for 4.0.0 in order of importance

  1. Block-oriented rewrite of the text parse routines.

  2. Object-oriented demo handling. This is really necesary for further
     recording formats.

  3. More code generation out of the specs source.

  4. Strict separation of the different recording types and the main
     program.  Maybe something like librecord.so.

  5. --split-multi option to split multi-level recordings.

  6. Half-Life (DEM), Heretic II (DM2) and Sin (DM2) support.

  7. DEMcut and DBS with QWD and DM2 support.

  8. File-IO from stdin and to stdout, really difficult is the file type
     detection.

  9. Redneck Rampage decompression.


  Ideas finally dropped out:

  1. Hexen II and HexenWorld support.


  Open problems

  1. Does someone know the difference between the Redneck Rampage
     compression algorithm and the one used in Duke Nukem 3D?


  A new regular version of LMPC (like 3.2.8) will be announced on
  BluesNews and on PlanetQuake.

  You can download LMPC from my Demo Specs page
  <http://www.planetquake.com/demospecs>.

  There you will find always the latest release with new features and
  brand new bugs.



