Man Linux: Main Page and Category List


       liquidwar - a unique multiplayer wargame


       liquidwar [-vh]


       Liquid  War is a multiplayer wargame. Its rules are very simple but yet


       -v Displays the version number.

       -h Displays copyright and various information.

          There are many other command  lines  options,  which  are  described
          further in this document.


       As  Liquid  War  is  a  cross-platform program (it also runs on DOS and
       Windows), I could reasonably not provide groff UNIX-style documentation
       to  Windows user. Therefore, Liquid War’s documentation is available in
       many formats, including HTML, PostScript and PDF.
       I believe these formats are easier to read  than  this  man  page.   So
       check         out         the        /usr/share/doc/liquidwar        or
       /usr/local/share/doc/liquidwar directories, for this is where HTML  and
       other  documentation  files should be. Otherwise, if you are a die-hard
       man page user, you may continue with this document 8-)


   The Liquid War concept
       Liquid War is a wargame. But it is different from common wargames.

       When playing Liquid War, one has to eat one’s opponent.  There  can  be
       from  2  to 6 players. There are no weapons, the only thing you have to
       do is to move a cursor in a 2-D battlefield. This cursor is followed by
       your  army, which is composed by a great many little fighters. Fighters
       are represented by small colored squares. All the fighters who have the
       same  color  belong  to  the same team. One very often controls several
       thousands fighters at the same time. And when fighters  from  different
       teams meet, they eat each other, it is as simple as that.

   How do teams react?
       Teams   are  composed  of  little  fighters.  These  fighters  all  act
       independently, so it can happen that one single fighters does something
       different from what all the other do.

       The main goal of these fighters is to reach the cursor you control. And
       to do that, they are in  a  way  quite  clever,  for  they  choose  the
       shortest  way  to  reach it. Check it if you want, but it is true, they
       *really* choose *the* shortest way to reach the  cursor.  That  is  the
       whole point with Liquid War.

       But  these  fighters are not perfect, so when they choose this shortest
       way, they do as if they were alone on the battlefield.  That’s  to  say
       that if there is a fighter blocking their way, they won’t have the idea
       to choose another way, which is free from fighters but would have  been
       longer otherwise. So fighters can be blocked.

   Who eats whom?
       When  two  fighters from different team meet each other, they first try
       to avoid fighting, and they dodge. But if there is no way for  them  to
       move,  they  get  angry  and  attack  the  guy  which is blocking them.
       Sometimes, they attack each other and both loose  health.  But  it  can
       happen  that a fighter is attacked by another one, which is himself not
       attacked at all.

       Here is an example of this behaviour: A blue fighter and a red  fighter
       both want to move to their right, for that would be the shortest way to
       reach their cursor if there was nobody on the battlefield. But they are
       blocked  by other fighters. If, for instance, the red fighter is on the
       right and the blue fighter on the left, it is  the  red  fighter  which
       will be eaten.

       When a fighter is attacked, he first looses health, that is to say that
       he gets darker. When his health reaches 0, his  color  changes  and  he
       becomes  a  member of the team by which he has been attacked. Therefore
       the number of fighters on the battlefield always remains the same.

       When fighters of a same team get stuck together and block  each  other,
       then they regenerate, that is to say that they get brighter.

       However, I think the best way for you to understand the way it works is
       to try the game...

   Basic strategy
       When I play Liquid War, I always try to surround my opponents,  and  it
       usually works.

       By  the  way, the computer has no strategy at all, he is a poor player,
       and if you get beaten by him, it means you have to improve  yourself  a

       But  still,  the  computer  doesn’t  do  one thing which I’ve seen many
       beginners doing: he never keeps his  cursor  motionless  right  in  the
       middle of his own fighters, for this is the best way to loose.

   More strategy
       Here are some more tips, kindly submitted by Jan Samohyl.

       *  Try  to cut your opponent off walls and surround him completely with
          your troops; when trying to penetrate his forces  inside  a  tunnel,
          keep  your  troops at the wall (and force them ocassionaly to attack
          off the wall). I think this is a biggest weakness  of  the  computer
          AI, that it doesn’t know this.

       *  When  luring  your  troops  to  outflank  an enemy, always move your
          cursor through the enemy, not the other way around.

       *  To penetrate very narrow tunnels, stand back for  a  while  and  let
          some  enemy  troops come from the tunnel to you. Then surround them,
          destroy, repeat.

       *  I have observed  that  with  more  than  2  players  (6),  the  game
          difficulty  depends  on the map in the following way: If the playing
          field  is  completely  empty,  without  any   holes   (topologically
          equivalent to full circle), the game is the easiest, because you can
          just go through the middle to outflank your opponent. If there is  a
          single  large obstacle (ie. playfield is topologically equivalent to
          ring (the area between two nested circles)), the game  is  the  most
          difficult,  because you have to choose one direction for the attack,
          and cannot simply defend the other direction.  For  other  maps,  it
          seems  to  really  depend  on  their  similarity to one of these two
          extreme situations (and army size, of course, because it changes the
          relative  size  of  obstacles). Also, if you would later add another
          cursor, this property would probably  disappear  (maybe  then  games
          with n+1 obstacles would be the hardest ones with n cursors).

       *  If  you  want a particularly challenging computer game (at least for
          some maps), use several players, max out attack,  min  out  defense,
          max out base health (opposite would be harder, but game then changes
          to the large cloud of black troops, so you don’t see  anything)  and
          give winner an advantage.

   The winner is...
       The  clever guy who has got the greatest number of fighters in his team
       at the end of the game. Or the  one  who  exterminates  all  the  other


       Liquid War rules have been invented by Thomas Colcombet.

       He  was  trying  to  find algorithms to find the shortest path from one
       point to another, and found the Liquid War algorithm. Then it  came  to
       his mind that a game could be build upon this algorithm, and Liquid War
       was born. He programmed the first two  versions  of  Liquid  War  using
       Borland  Pascal  for  DOS,  and  gave  me  some  information  about the
       algorithm so that I could re-program it.

       I’m the guy who  programmed  the  latest  versions  of  Liquid  War.  I
       enhanced the algorithms, and did quite a bunch of work to have the game
       playable by (almost) anyone, that’s to say create a correct GUI.

       If you want to join me, here’s all the information you’ll ever need:

       Christian Mauduit

       Web site:

       GnuPG public key: FD409E94 -
       GnuPG fingerprint: 4762 1EBA 5FA3 E62F 299C  B0BB DE3F 2BCD FD40 9E94

       Snail mail: 32 rue Jean Moulin  95100 Argenteuil  FRANCE

   Other contributors
       As Liquid War is now free software, protected by  the  GPL,  anyone  is
       allowed  to  view,  edit,  modify,  re-compile  the  source  code,  and
       distribute it, as long as Liquid War is  still  distributed  under  the

       Here’s a list of the contributors:

       *  Alstar:  drew a map, which is now included in the main distribution.

       *  Peter Wang: ported Liquid War to GNU/Linux.

       *  Cort Danger Stratton : helped me setting up network support.

       *  Tim Chadburn : wrote midi files for the game. His  contribution  has
          been  truely  appreciated  since  it’s  rather  hard to find GNU GPL
          compliant artwork. He also wrote documentation and helped with  midi
          support in general.

       *  Jan  Gretschuskin  :  contributed  11  maps,  and  made  the  German
          translation. So if you run Liquid War with German  menus,  you  know
          who  you  have  to  thank  ->  Jan!  8-) Also do not forget to visit

       *  Mouse : contributed a map.

       *  Rene Stach : drew 3 maps.

       *  Roderick Schertler : implemented HTTP 1.1 support.

       *  Ryan D. Brown : ported Liquid War to Mac OS X.

       *  Eduard Bloch : maintained the Debian package, and helped with German

       *  Michael Terry : provided a .desktop file for better integration with
          Gnome, KDE and other UNIX desktop environments.

       *  Kasper Hviid : contributed many maps, with their own  textures,  and
          made   the   Danish  translation.  Great  work,  also  available  on

       *  David Redick : wrote an external random map generator, available  on

       *  Alexandre Pineau : maintains the Debian package.

       *  Michael Wagner : translated the web site in German.

       *  Peter Williams : fixed the "too many opened socket" server bug.

       *  Jan Samohyl : submitted strategy tips.

       *  Gavin : wrote the Liquid War fanfic.

       *  Dave Vasilevsky : fixed the Mac OS X port.

       *  2 of omega : contributed a map.

       *  666-REFIZUL-666 : created many maps (distributed separately).

       *  Thomas Klausner : fixed Makefile for FreeBSD

       *  Joan Dolc : helped with Mac OS/X port

       Many  other people helped me by submitting bug reports and patches, and
       I want to thank them for their precious help. Thanks to all the  Debian
       people too, who nicely maintain the Liquid War .deb package.

Mailing lists


       This  list  is  for  general discussions about Liquid War. Here you can
       make suggestions, submit bug  reports,  ask  for  help,  find  players,
       etc...  Basically,  any  question  or remark which concerns the game is
       welcomed on this list.

       Practical informations

       You can’t send messages to  the  list  without  subscribing.  The  only
       reason  for  this  is  that  it’s  one  of  the  only way to block spam
       efficiently. I first thought it could be OK to allow  anyone  to  post,
       but  liquidwar-user seems to have be harvested by robots, so now I need
       to restrict posters. However, I insist on  the  fact  that  anyone  can
       subscribe, and the subscription to the list is not moderated. So if you
       are a human being and not a stupid spam robot, you’re  welcome  on  the
       list 8-)

       Here’s a list of usefull URLs:

       *  To                                                    (un)subscribe:

       *  To                         consult                         archives:

       *  To post on the list:

   Chat and IRC
       Web-based chat-box

       I  have  have  set  up  a  web-based chat-box which is accessible here:

       It’s not as good as a good old IRC channel but not  everybody  can  use
       IRC  (because  of  firewalls  and  the likes), and I like the idea that
       people can chat and have the list of available servers  in  one  single
       web page.

       IRC channels

       I  personnally  spend some time on so you might use it
       to find other players - though I’m not really an IRC  addict...  ...not
       yet at least!

       Here are the channels I recommend:

       *  #liquidwar  : Liquid War dedicated channel, to find players and chat
          while playing.

       *  #netgame_players : general channel for  players  who  want  to  play
          Internet  games  - Free Software and/or Open Source games of course,
          we’re on 8-)


   Whats this?
       Quoting Gavin: "I wrote a liquid war fanfic some time ago [...] I wrote
       it  after  a  friend  claimed  that  there wasn’t any liquid war fanfic
       because it wasn’t possible."

       So here it is, a Liquid War  fanfic,  enjoy!  (and  special  thanks  to

   The Battle of Emberlificoted

       The  General  presided  over  his  massing  army in his seat, or rather
       hovering ring, of power. It dipped slightly as he  flew  low  over  his
       troops  marching through the viscous marsh-like terrain. They were like
       children: obedient, loyal, and they ate a lot.

       Glancing at the status panel mounted in front of him he  grimaced;  the
       other  five  armies:  Yellow, Green, Orange, Turquoise, and, of course,
       Red, were also readying armies of a similar size to his own. His violet
       clones would have to fight hard and eat well to win this day.

       Today  would  not be a battle of luck, the General mused, it would be a
       battle of tactics, of alliances,  and  of  betrayal.  Every  clone  was
       identical  -  that was the general idea behind clones - and the terrain
       seemed strangely symmetrical; it would not give advantage to any of the
       six  armies  amassed today. Glancing at the hologram of the battlefield
       projected in front of him the General noted that he would have to  move
       quickly,   Orange  and  Yellow  were  too  close  for  comfort,  though
       fortunately Baron Red’s army  of  eponymous  coloured  clones  was  the

       General  Violet’s  fingertips  were sweaty even before they touched the
       four main control keys in front of him. They  were  labeled  ’W’,  ’A’,
       ’D’,  and,  of  course,  the  full  retreat  button  -  very useful for
       misleading foes and ambushing them as they pursued - ’S’. The keys were
       arrange  in  a roughly equilateral triangular pattern; with ’S’ forming
       the base and being adjacent to both ’A’ and ’D’, ’W’ formed the tip  of
       the triangle.

       A long breath left his parched lips as at last he made his move.


       "Dammit!"  he  screamed  moments later. He had misjudged Captain Yellow
       and  Commander  Orange;  he  had  expected  one  at  least  to   attack
       immediately,  one  he  could have handled. They were working together -
       foiling his attempt to shoot between them to near  the  center  of  the
       battlefield  to  gain  a  better  vantage  point.  Yellow had shot down
       towards him, cutting off his advance, and now  Orange  had  sealed  his
       escape  route.  "It’s  not  over yet" muttered the General. He opened a
       voice channel with Commander Orange:

       "Very clever. Flawed, but still clever."

       "Flawed?" came the reply.

       "Yes flawed, when the good Captain is finished devouring my army who do
       you  think  he  will  turn  to  next?", bluffed the General - his hands
       worked quickly as he manoeuvred his hovering control ring, all that his
       troops  ever  saw  of him, carefully towards the weakest section of his
       attackers. If he could just break out a few units he  could  soon  turn
       the tide against both Yellow and Orange.

       "We have an alliance..." Orange’s voice was unsure now.

       Time for some sarcasm to through her even more off balance, thought the

       "I gathered", he spoke softly, slowly, and with too much meaning.  Then
       closing the channel he turned his attention back to his escape.


       "Yes!"  wooped  the  ecstatic figure of the General. Fifty or so of his
       troops had broken free undetected and were even now working  their  way
       cautiously  towards  the camps of the Yellow army, only the front lines
       were still actively fighting; this opening gambit of Yellow and  Orange
       had turned into a stale siege and Yellow’s army had pitched tent.

       General  Violet steered his hovering guidance ring to the center of the
       Yellow camp. His troops struck, both those who had got behind the lines
       and  those  who  were  still  besieged.  Yellow  reacted too slowly and
       suddenly found that her army, was shrinking back  from  the  onslaught.
       There  was  nowhere  to  run  to, and bye now her only ally - Commander
       Orange - had abandoned her to her fate; he was too busy  engaging  Sir.
       Turquoise,  who had managed to escape from the slaughter that the Baron
       had caused to the Turquoise ranks and was even now valiantly  attacking
       the flanks of the Orange troops.

       A glance at the status panel showed that Yellow’s life force was fading
       quickly: 8%, 3%, 1%, Gone.

       The General smiled, he always enjoyed getting the first  kill,  and  by
       now his armies life force had grown and his clones had replicated. With
       his, now, formidable fighting force it was no problem  to  engulf  both
       Sir.  Turquoise  and  Commander Orange’s brawling armies and annihilate
       them. Once again his army grew in size and power. Now if only the Baron
       didn’t notice that..., thought the General.


       "Too  late!"  yelped  the General, now thrown into panic, as he saw the
       approaching Baron. His army had also grown in size and power  -  having
       fatally  injured  the  Turquoise army within the opening moments of the
       battle, and having finally managed to catch the  elusive  fleeing  form
       of, or what remained of, Emperor Green.

       Gripping  the  controls  harder  the  General thought quickly, his army
       doesn’t so completely outnumber me that this is already  over,  however
       unless  I  can  cause  him to make a mistake that allows me to take the
       upper hand then I will inevitably lose. Maybe I can...

       This thought was terminated and replaced  by  another  as  the  Baron’s
       angry  red  troops broke through the undergrowth that had covered their
       movements and started to surround the General’s army. The thought  that
       now  throbbed  through  the  panic-stricken  mind of General Violet was
       simply ’Run!’.

       Even as he signaled the retreat and made for what seemed to be the only
       possible means of escape the Baron’s blood red control ring appeared at
       the opening. The General knew it was over, even before the host of  red
       beings appeared at the opening.

       There  was  no  escape.  His  life force was almost depleted and he was
       surrounded. Then it was that the Baron decided to communicate:

       "Too bad. It was a good game"

       The General blinked, gaped, and was generally gobsmacked.  Just  before
       his  life  force  completely  failed  and  his own weary eyes closed in
       defeat he snarled,

       "What!? This is not a game!" were the General’s dying words.

Menus and hot keys

       This section describes how the GUI works.  Since  programming  advanced
       GUIs  with  Allegro  is not so easy - standard C programming definitely
       lacks flexibility -, and also since it’s somewhat hard for me to figure
       out  what  is  user-friendly and what’s not, Liquid War’s menus are not
       always self-explanatory. I’ll just try and  do  something  better  next

       Map menu

       The  map  menu allows you to choose the map you are going to play on. A
       map is defined by 3 things:

       *  A frame. The frame can be chosen with the slider which is below  the
          preview.  The frames are automatically sorted by alphabetical order.

       *  A texture for walls.

       *  A texture for the zone where fighters are allowed to move.

       In the middle of the screen, there is a preview of the level.  In  this
       menu, the values of the parameters can be independently changed by:

       *  Moving a slider.

       *  Clicking on a "+" or a "-" button.

       *  Typing a number.

       On  each  side  of  the  preview,  sliders  allow you to choose the two
       textures. There is also a preview of each texture. Below  this  preview
       there  are  128 little buttons which allow you to choose single colored

       The name of the map and its resolution are displayed in the lower  part
       of the screen.

       You’ll  notice  that  on  some  maps the texture selection zones simply
       disappear. This is because these maps are associated with a texture, so
       choosing a different texture is often not recommended for it won’t look
       as nice as with the right one. If  you  still  want  to  override  this
       behaviour  you  can click on the "on/off" button just right to the "Use
       default texture" label. This is a toggle button which will allow you to
       use  your  own  textures even on maps that normally come with their own

       You’ll also notice that a "Random map" button is available. This button
       generates  a  new  random  map  using  an external program, "lwmapgen",
       developped       by       David       Redick,       available        on

       This program supports many command line options, and if you want a very
       precise  control  on  the  generated  maps,  you’ll  need  to  run   it
       separately.  Looking  at  LW’s  log  file you should be able to see the
       commands LW issues when calling this program, this can give  you  ideas
       on  how  to launch it manually. Alternatively using the "--help" option
       (for instance "liquidwar-mapgen --help" under UNIX) should describe how
       to use it.

       Teams menu

       This menu allows you to choose the teams which are going to play. There
       are 6 square zones in this menu. Each of them is associated to a  team.

       Each team can be either:

       *  Disabled ("Off")

       *  Controlled by a player ("Human")

       *  Controlled by the computer ("Cpu")

       The  computer  plays poorly, so remember that Liquid War is basically a
       multiplayer game, and that the cpu control is  dedicated  to  beginners

       You  can  also  choose the color associated to each team by clicking on
       one of the 12 colored buttons.

       Below the 12 colored buttons, there are four buttons which allow you to
       choose  your keys. Click on one of these buttons and then press the key
       you want to define. Joystick movements and buttons  are  considered  as
       keys.  You  can  disable  the  joystick with the button which is at the
       bottom left of the menu.  Mouse  input  is  also  possible,  and  mouse
       movements are considered as keys too. To define mouse control, click on
       the button associated to the direction you want to  control,  and  then
       move  the  mouse.  Then the button should display something like "M->".
       Mouse sensibility can be set with the little slider at the bottom right
       of the menu.

       Graphics menu

       Here you can choose the graphic options of the game.

       The  "Video  mode"  button  allows you to switch between fullscreen and
       windowed mode. This button is not available under DOS.

       The "Brightness" slider allows you to set the brightness of the game.

       The "Menu res" slider allows you to set  the  resolution  used  by  the
       menus.  There  are  currently  5 possible values, which depend on which
       platform you’re running the game on.

       I personnaly think the menus look best with the 640x480 resolution, but
       some  may  prefer  higher resolutions. Lower resolutions should only be
       used if you have problems using SVGA video modes.

       The "Game res" slider allows you to set the resolution used during  the
       game.  The  allowed  values  are  the  same than those for the menus. I
       recommend that you don’t use resolution higher than 640x480, unless you
       have a Pentium VIII running a 10GHz.

       Page flipping can be toggled. It is up to you to decide wether you keep
       this option or not. The main disavantage of turning page  flipping  off
       is  that  the info bar and the battlefield can look rahter ugly if they
       overlap. But if you turn page flipping on you will not easily reach the
       166 frames per second I sometimes get on small levels with my K6-225. I
       personnaly always turn page flipping off.

       The viewport size defines how much of your screen will be used  by  the

       *  If you set the slider on its left position, the batllefield will not
          be stectched at all. Or if is strechted, it will be by a x2 or a  x4
          factor. So this is the mode wich allows the fastest display.

       *  If  you  set the slider ont its right position, the game will run in
          fullscreen mode.

       *  With all the other positions of the  slider,  the  battlefield  will
          keep its general proportions but it will be stretched.

       The  "Waves"  button allows you to toggle the wave effect. You can also
       do this while playing, by simply pressing F4.

       Sound menu

       This section allows you to set the sound volumes. There are 4  sliders,
       which are:

       *  "Sfx":  sets  the  volume  of  all  the sfx sounds, thats to say’the
          sounds you hear when the game starts, when you loose etc...

       *  "Click": sets the volume of the click, this  nasty  noise  you  hear
          each time your press on a button.

       *  "Game water": sets the volume of the blop blop blop sounds which are
          played continuously while you are playing.

       *  "Menu water": the same  thing  than  "Game  water"  except  that  it
          concerns the sounds played while your are choosing options.

       *  "Music": general music volume.

       Rules menu

       This menu is the one where you can change the rules of the game.

       The  "Time"  slider  controls  the time limit. The game will stop after
       this time is elapsed. You can pause the game by pressing the "F3"  key.

       By  the  way,  an  info  bar  can  display  the time left while you are
       playing. This info bar can be toggled during the game by  pressing  the
       "F1"  key, and you can change its location by pressing the "F2" key. It
       also displays how many fighters there are in each team.

       The "Army size" slider controls the amount of fighters there will be on
       the  battlefield.  The  position  of  the slider reflects the amount of
       fighters of all the teams together. If there are  4  teams,  then  each
       player  will  have  half as many fighters than if there had only been 2

       The "Cursor x" slider controls the speed of your cursor.

       *  If it is set on the left, the cursor goes at the same speed than the

       *  If it is centered, the cursor goes twice faster than the fighters.

       *  If  it is set on the right, the speed of the cursor is multiplicated
          by 3.

       Below is a "Min 160x100" box with a slider on  its  right.  This  means
       that  maps  will automatically be magnified so that they have a size of
       at least 160x100. Indeed, some of the maps that come  with  Liquid  War
       were  designed  in 1995 when 486 Intel computers were common. Therefore
       the maps were smalls. Today, these maps are not really fun to  play  on
       fast  computers,  so  Thomas  Harte suggested this automatic magnifying
       feature, and that was IMHO a smart idea. You can move the slider to the
       right to make maps use a higher resolution - ie magnify them.

       The  "Defaults"  button  of  the "Rules" menu will reset rules to their
       defaults. This way you can tweak  rules  and  then  come  back  to  the
       default  rules  whenever  you want. Note that there’s also a "Defaults"
       button in the main "Options" menu, but it  will  reset  *all*  options,
       including player names... The advantage of the "Defaults" button in the
       "Rules" menu is that it will only reset rules parameters, and keep  the
       rest of your configuration options untouched.

       Speeds menu

       The  "frames/s"  slider  allows  you  to limit the number of frames per
       second. If this slider is set on the left, there won’t be any limit, so
       Liquid  War  will  repaint your screen each time the fighters move. But
       this can be a weird behaviour if your machine is really  fast,  for  no
       one  cares  about  100  fps per second, one can not even see them... So
       this paramters limits the  refreshment  rate,  so  that  there  can  be
       several  logical  moves of the fichters for only one screen refreshing.
       If it is set on its right, the display is limite to 10 fps,  so  you’ll
       have  to  find  your setting. I personnally set it right in the middle,
       and get 40 fps. If you press "F5", you’ll get the number of frames  per
       second,  and  if you press "F6", you’ll get the number of logical moves
       per second. You can also press "F7" or  "F8",  and  you  will  get  the
       percentage  of  time  your computer spends on calculating or displaying
       the level.

       The "rounds/s" slider allows you to limit  the  number  of  rounds  per
       second. If this slider is set on the left, there won’t be any limit, so
       Liquid War will run as fast as possible. This setting will be of no use
       if  you  use  Liquid  War  on a slow computer or if you play with hudge
       maps, but sometimes, with  a  high-end  Pentium  class  computer,  it’s
       simply  impossible  to  play on small maps because things simply go too
       fast. So this parameter is here to help you and avoid the "10000  moves
       per sec" problem.

       Waves menu

       This is where the wave parameters are set. The waves are just a graphic
       effect, which is not really usefull. I don’t often  use  waves,  but  I
       still  think  they  can sometimes look nice. Change these parameters if
       you really mean to do it, but if you don’t understand what  they  mean,
       it is really OK...

       There are 4 different types of waves, each of them being defined by:

       *  An "Ampli" parameter, to define how big the waves have to be.

       *  A  "Number"  parameter, to define how many waves should be displayed
          at the same time.

       *  A "Speed" parameter, to define how fast the waves should move.

       If you want to undestand what the "WX",  "HY",  "WY",  and  "HX"  codes
       mean,  try  to pay with only one type of wave, the "Ampli" parameter of
       the 3 other types of wave being set to 0 (that is to say the slider  is
       on its left position), and sea how it looks like.

       The  wave  effects  can be toggled during the game by pressing the "F4"

       Advanced menu

       This menu allows the user to change the behaviour of the fighters.

       The "Attack" slider sets the agressivity of the fighters. If it is  set
       on  the  right,  fighters eat each other very fast. If it is set on the
       left, it takes ages to fighters to change teams.

       The "Defense" slider sets  the  capacity  that  the  fighters  have  to
       regenerate themselves. The more it is on the right, the faster fighters

       The "New health" slider sets the health of the fighters which have just
       changed  teams.  The  more it is on the left, the weaker these fighters
       will be.

       The "Winner help" slider controls a parameter which causes fighters  to
       attack  with  various strength depending on how many fighters belong to
       their team. Not very clear... Let’s just say that:

       *  If this slider is set on the right, the more fighters  you  have  in
          your team, the more aggressive they will become.

       *  If it is centered, all the fighters of every team will always attack
          with the same strength.

       *  If it is set on the left, the less fighters you have,  the  stronger
          they will be. In this mode, games usually never end.

       The  "Cpu strength" parameter never makes the computer more intelligent
       than a monkey. But if you set  it  on  the  right,  it  advantages  the
       machine  outrageously and fighters controlled by the cpu will be really
       strong. So to get rid of them you’ll  definitely  need  to  be  clever.
       Again  and  again,  don’t  forget  that  Liquid  War was conceived as a
       multiplayer game and that playing against the computer is not really an
       interesting thing to do.

       The  "CPU vs human" parameter allows you to control how aggressive CPUs
       are towards humans.

       *  If set to "Always", CPUs will always attack humans  and  will  never
          try  to  attack  another  CPU, unless there are no humans left. This
          used to be the default behavior in previous Liquid War versions, but
          some  players  remarked that it was rather unfair, so now this is an

       *  If set to "Random", CPUs won’t care wether their opponents are  CPUs
          or humans, they’ll attack anybody. This is the default behavior.

       *  It  set  to  "Never",  CPUs  will attack each other before bothering
          human players.

       The "Allow net bots" button can be used to allow  bots  to  connect  on
       network  games.  Indeed, bots are by default disabled in network games,
       since in this case LW assumes that bots are useless (there are  already
       several  human players). However, turning this option on will allow you
       to connect bots within the game. It’s important to note that this is  a
       per client option, this means that you can’t use it to forbid access to
       bots to a given network game. This option was simply created  to  avoid
       confusion  when  connecting on network games, while still allowing bots
       to connects if you really want them to.

       The "Algorithm" parameter allows you to force the algorithm to standard
       C  mode.  There’s  no real good reason you would like to do this, since
       the C algorithm is slower than the ASM one. Moreover, the ASM algorithm
       is automatically disabled if you play against a computer which does not
       have ASM enabled. Think of this as a testing/debugging option.

   Hot keys
       Here’s a list of keys you might use while playing:

       *  F1: toggles the "info" zone where the game time  and  the  state  of
          each team is displayed.

       *  F2: moves the "info" the zone arround, possible positions being top,
          right, bottom and left.

       *  F3: pauses the game. This function is disabled during network games.

       *  F4:  toggles the "wave effect". Without this "wave effect", which is
          turned on ny default,the game will run faster.

       *  F5: displays the number of frames per second (*).

       *  F6: displays the number of rounds per second (*).

       *  F7: displays  the  precentage  of  CPU  spent  on  the  game  logic,
          calculating where fighters must go for instance (*).

       *  F8: displays the precentage of CPU spent on graphics (*).

       *  F9:  turns  on/off  the "capture" mode. In this mode, screenshots of
          each frame are taken, and written to the hard drive as bitmaps.

       *  F10: quits the game right away without any confirmation prompt, also
          known as the "my boss is coming here!" function.

       (*)  all  these  figures tend to be clearly false as computer go faster
       and faster. Basically, the time  required  for  "logic"  and  "display"
       operations  is  getting  shorter  and  shorter,  and the tools I use to
       measure it are not precise enough. Therefore I get approximations which
       might by plainly wrong.

Network game

       Since release 5.4.0, Liquid War includes network support, that’s to say
       that people can play over a LAN (Local Area Network). However,  due  to
       limitations  in  Liquid War’s legacy code, and also because of the lack
       of time I have, it might be a little tricky to set up a network game at
       first. So please read this section carefully.

       You should keep in mind that:

       *  DOS only releases of Liquid War do not include network support, only
          Windows and GNU/Linux versions will allow you to set  up  a  network

       *  The  game  should  run  fine on any LAN, but there’s no garantee the
          game will be playable on the Internet. Indeed if your  "ping  delay"
          is  not good enough, the game will be awfully slow. Bandwidth is not
          an issue, since Liquid War rarely needs more than 2 Kb/sec.

       *  You’ll need to know what an IP address is.

       *  You don’t need to set up a network game to run a  multiplayer  game.
          Liquid  War  was  originally  a  multiplayer  game  without  network
          support. Network support is here only  for  people  who  don’t  feel
          comfortable when playing at 6 on the same keyboard 8-)

   Getting started
       What do you need?

       You’ll basically need 2 computers connected on the same LAN. We’ll call
       them computer A and B. You might be able to play over the Internet too,
       but  the game can be harder to set up and - which is worse - very slow.

       You’ll also need to know the IP address of computer A. Type  "ipconfig"
       under  Windows  or  "ifconfig"  as  root  under  GNU/Linux  to get this
       information if you don’t have it.

       Starting the server

       Liquid War uses a very traditionnal client/server approach.  Basically,
       the  server  gets informations from all the clients and then dispatches
       the collected information to everybody.

       So  you’ll  need  to  start  a  server  on  computer   A   by   running
       "liquidwar-server" on GNU/Linux or "lwwinsrv.exe" on windows. This is a
       console application, ie it does not set up any graphic mode.

       Here’s a small example of a server start on GNU/Linux:

       $ liquidwar-server
       How many teams will connect to this server?

       At this point you must enter a number between 2 and 6, and  then  press
       "ENTER".  In  this example we will answer 2. The server really needs to
       know how many teams  will  be  in  the  game:  when  enough  teams  are
       connected,  the  game  starts.  It  can also be a good idea to answer 6
       systematically and then force game start by clicking  the  "Start  now"
       button within the client. It’s possible to skip this question by typing
       "liquidwar-server -2" instead of a plain "liquidwar-server".

       Use "-2" to get rid of this question.
       Register on "" (y/n)?

       Now if we answer "y", then the server will  automatically  contact  the
       "meta-server"       and       it       will      be      listed      on

       This can be convenient for people who want to find other gamers to play
       with on the Net. For now, let’s answer "n", we’ll test this meta-server
       stuff later 8-)

       Use "-private" to get rid of this question.
       2002-06-03 16:43:00: Listening on port 8035...
       2002-06-03 16:43:00: Waiting for 2 teams...

       Now the server is ready to accept clients. By  default  it  listens  to
       clients on port 8035. You could change this behavior setting by calling
       "liquidwar-server -port 8061" for instance, but let’s use  the  default
       port to make things easier.

       Starting the clients

       Start  the  client  on  computer  A  normally  by typing "liquidwar" on
       GNU/Linux or double-click "lwwin.exe" on Windows.

       Go to the "Teams" menu and select 2 teams, a red human and a  blue  CPU
       for  instance.  If  you  don’t  know  how to do this, then try and play
       Liquid War on a single computer first. It’s important to notice that by
       default the "blue CPU" won’t connect on the network game. It’s possible
       to allow bots to connect on network games, but  they  are  disabled  by

       Now  come  back  to  the  main  menu, and a "Net Game" button should be
       available. Click it. Now you should be able to:

       *  Start the game.

       *  Change the IP address of the server.

       *  Change the communication port.

       *  Set a password.

       *  Search for internet games automatically.

       Since the server is also running on the same machine (A), you can leave
       the default IP address as is (

       Now  you  are ready to start the second client on computer B. Like with
       computer A, you’ll have to:

       *  Select 2 teams, green an yellow this time.

       *  Select "Net Game" in the main menu.

       But this time you’ll also need to change the server address, since  the
       client is not running on the same computer than the server.

       Now  click  on  "Start  game"  on  computer A. The server should play a
       "system beep", which is usefull if you run a  server  and  want  to  be
       notified  of  client  connections  without watching the console all the
       time, and it should display messages like this:

       2002-06-03 16:44:48: Connection from ""
       2002-06-03  16:44:48:  Team  "Napoleon"  on  client   ""
       2002-06-03 16:44:49: Client "" accepted
       2002-06-03 16:44:49: Waiting for 1 team...

       And  on  the  client  you should see a screen which says "Waiting for 1
       team(s)" with the list of connected players below  (Napoleon).  You  do
       not need to click on the "Start now" button.

       Now  click  on  "Start  game"  on computer B. The server should display
       messages like this:

       2002-06-03 16:49:14: Connection from ""
       2002-06-03 16:49:14:  Team  "Henri  IV"  on  client  ""
       2002-06-03 16:49:15: Client "" accepted
       2002-06-03 16:49:15: Client "" ready
       2002-06-03 16:49:15: Client "" ready
       2002-06-03 16:49:15: Sending info to ""
       2002-06-03 16:49:15: Sending info to ""
       2002-06-03 16:49:16: Game start

       And at that point, the game should start 8-)

       Restart a new game

       Once  the  game  is  over,  you  can  start another network game on the
       clients without touching the server, because the  server  automatically
       restarts and waits for players to connect.

       To  stop the server - if you want to change its settings for instance -
       just go to the console where it’s running and press CTRL-C.

   Using the meta-server

       The meta-server is a piece of software which is running on my web site,
       and allows servers to register themselves so that client can get a list
       of available servers.

       It’s written in PHP and is _very_ basic but I believe it’s  enough  for
       what has to be done: maintain a list of running servers.

       The  source  code for the meta-server is included in the source package
       of Liquid War, so you might run such a server yourself if you want  to.
       However,  by  default, servers will register themselves on my web site,
       and will be listed on

       How to register a server

       Launch the server, and when you get the question:

       Register on "" (y/n)?

       answer "y".

       Note  that  if you’re behind a proxy or a firewall, the server might be
       unable to register itself. Clients might also have problems to  connect
       themselves  on your server if there’s a machine which does NAT (Network
       Address Translation) between you and the meta-server.

       How to find a server

       In the main menu, click on "Net Game" and  then  "Search  for  internet

       Now  you  should  see a list of available servers. You can click on the
       items in the list to get more informations about a given  server.  Once
       you have chosen a server, click on "Join now".

       Now you get on a "Waiting for teams" screen. You might be interested in
       using the "Start now" button. Indeed, if you are 4 players connected on
       a  server  that accepts up to 6 players, maybe you’ll want to start the
       game right away without waiting for 2 more players. In this case, every
       player  must click "Start now". A "*" character will replace the "-" in
       the players list when a player clicks on  "Start  now".  When  all  the
       players are displayed with a "*a, the game starts.

       You can also chat with other players by entering text in the area above
       the "Send message" button, and then click on this button. Keep in  mind
       that  this  is  a  very  primitive  chat  and that the best way to chat
       efficiently is IMHO to play in windowed mode and have an IRC client  at

       Note  that  you  can  also  get  the  list  of  available  servers from  There  you’ll   also
       find  a  little chat-box which will allow you to send exchange messages
       with other players.

       Server options

       You can pass  options  to  the  server  using  the  command  line.  The
       following parameters are accepted:

       *  "-n"  where  "n"  is a number between 2 and 6 : with this option you
          can tell the server how many teams will connect to the game. Beware,
          there  can  be several teams on the same computer, so if you want to
          have a computer with 2 players on it and 2 other  computers  with  a
          single player, then you need to use the "-4" option.

       *  "-lag n" where "n" is an integer : with this option, you can control
          the lag used at startup. Normally, Liquid War handles this parameter
          automatically, but you might want to force it to a given value.

       *  "-port n" where "n" is an integer : allows you to change the IP port
          used by the server to listen  to  the  clients.  if  you  omit  this
          parameter, the default port is (8035) is used.

       *  "-log  file.log"  :  dumps all informations in "file.log" instead of
          using the standard output.

       *  "-public" : skips the "Register on ..." question, and registers  the
          server automatically on the meta-server, so that clients can find it

       *  "-private" : skips the "Register on  ..."  question,  and  does  not
          register the server at all.

       *  "-comment  This_is_a_comment"  : associates a comment to the server,
          which will be displayed by the meta-server. Note that the  character
          "_"  will  be  replaced  by  spaces. This makes command line parsing
          easier. I’m lazy 8-)

       *  "-password xxx" : associates a password to  the  server.  With  this
          option,  clients  will need to give the right password to be able to
          connect on the server.

       *  "-callback cmd" : with  this  option,  the  command  "cmd"  will  be
          launched whenever someone connects on an empty server. For instance,
          if you want to run a permanent server and want to know when  someone
          connects  but do not wish to permanently keep an eye on the server’s
          log, you might use this option and  put  in  "cmd"  a  command  that
          automatically  sends  you  a mail. You might also use a command that
          fires a popup window. It’s up to you. 2 sample scripts are available
          in  the  "misc" directory of the Liquid War source distribution. One
          is "misc/" and works on UNIX platforms,  and  the
          other  one  is  "misc/lwpopup.js",  which  is  automatically used by
          "misc/lwserver.bat", and works on Windows.

       Common options

       These options work on both client and server, even if they  are  rather

       *  "-metaserver url" : redefines the URL of the meta-server. Usefull if
          you want to use your own meta-server.

       *  "-netlog" : if you use this option, the server  will  dump  all  the
          network  traffic  on  the  standard  output.  This  is  usefull  for

       *  "-nobeep" : Disables the system beeps  that  the  application  might
          fire.  These  beeps  are mostly used on the server to notify clients

   About Liquid Wars network implementation

       Liquid War uses TCP sockets, and a single-threaded server. This implies

       *  The game can sometimes get blocked if you play on Internet.

       *  The server can’t talk simultaneously with several clients.

       I needed to use TCP sockets, since LW’s algorithm can not cope with any
       data loss and it’s not a reasonnable to try and anticipate what the map
       would be like if the player did not move etc...

       I  did not implement any complex multithreaded stuff since I’m lazy and
       however, clients need to have informations about all the  other  before
       something  can  be  done. However, implementing a mutltithreaded server
       could have advantages over the current solution.

       What is this lag stuff anyway?

       In Liquid War, all the clients send their key presses  to  the  server,
       and  then  the server dispatches this information to everyone. This has
       to be done for every round.

       You can easily imagine that if a player has a poor connection,  with  a
       very  long  "ping  delay",  it  can  take quite a long time to send the
       information to the server, and then get it back.

       So what Liquid War does is that at  the  beginning  of  the  game,  the
       server  sends a couple of "blank" key strokes to the clients. This way,
       clients receive data from the server before thay  have  sent  any.  The
       number  of  key strokes sent at the beginning of the game is called the

       So if it takes 200 msec to send and then receive data from  the  server
       (approx  the time returned by the "ping" command) then with a lag of 6,
       you can theorically play at a rate of (1/0.2)*6=30 rounds/sec.

       On one hand, setting the lag parameter to a high value will avoid  many
       network  errors  and allow you to play at a very fast pace, but the big
       drawback is that there will be quite a long time  between  the  instant
       you  send  a  key  stroke to the server and the moment it comes back to
       you. On the other hand, setting the lag  to  a  low  value  will  limit
       drastically  he  number  of  rounds  per second, but make the game more

       However, since release 5.4.1, the "lag" is modified  automatically  and
       should  adapt itself to the situation. I’ve not been able to test it in
       real conditions yet, but it should work 8-)

       Still, setting the lag to a sensible default value can  save  you  some
       trouble. Indeed, by default, Liquid War will choose a value (6), but it
       can not guess if you are playing on Internet or on a 100 Mbit LAN,  and
       it can take quite a long time before Liquid War automatically finds the
       right value. To know the right value which  should  be  used  with  the
       "-lag" option, simply play a few games and watch the average lag (which
       is displayed on the server console every minute)  at  the  end  of  the

       Performance issues

       Liquid  War  uses  a  "light" server, and one of the advantages of this
       solution is that it allows you to run the server on low-end  computers.
       I  personnally  run a permanent server on a 486 DX2, and it runs like a

       The only thing you have to take  care  of  when  running  a  server  is
       bandwidth.  Don’t worry, you won’t need a 10Mbit connection, basically,
       each clients sends and receives 12 bytes of data at each round. If  you
       add TCP/IP headers and the facts that stuff will probably be bundled in
       bigger packets, a client must deliver about 15 Kbit/sec (up  and  down)
       for  a  game that runs at 100 frames/sec. A 56K V90 modem is enough for

       So if you run a server with 2 clients connected, the server  will  need
       to deliver 30 Kbit/sec in both ways. A 56K V90 modem _can_ do that, but
       your provider needs to be a good one 8-)

       And if you run a server with 6 clients, you simply  won’t  be  able  to
       reach  the 100 frames/sec with a 56K V90 modem. It will necessarly drop
       to something less than 30 frames/sec, and is likely to drop to about 15
       frames/sec.  OK this is not a big deal, since few Internet games run at
       more  than  30  frames/sec,  but  well,  if  the  server  has  troubles
       receiving/sending data, everyone will wait, and the fun will go away.

       As  a conclusion: if you have the choice, choose the friend who has the
       best bandwidth to run the server, without even considering the power of
       his computer.

       General information

       Network  support  in 5.4 and 5.5 is still experimental in many ways, so
       you might get weird behaviors. Basically, if you have a  problem,  just
       do the following:

       *  Stop  and  restart the server when something goes wrong. To stop it,
          use CTRL-C.

       *  Check out that you have entered the correct IP addresses.

       *  Try and start the client and the server using the  "-netlog"  option
          to have an idea about what’s happening.

       Bugs in 5.4.x corrected in 5.4.2

       Liquid  War  5.4.0  and 5.4.1 were very hard to play over the Internet.
       The reason is that  the  network  routines  did  not  do  enough  error
       checking,  and  therefore  there  were  very  often errors when sending
       and/or receiving the map to the server. Hopefully, this bug should  not
       appear anymore in 5.4.2 or any other recent release.

   About security
       Network games passwords

       As  you  might  have  noticed,  under  the  box where you can enter the
       password, a little notice  explains  that  you  must  choose  a  "weak"
       password.  Now  you’ll  tell  me  ->  people keep on explaining me that
       passwords must be something complex like "aS\r!Y9p" and now I’m told to
       use "hello", what’s up?

       OK,  keep  in  mind Liquid War is a game. This password stuff is just a
       way to be able to play with your friends only and  keep  on  using  the
       meta-server’s  services. Liquid War does not encrypt data and I can see
       no good reason to do it for, so the password is stored and sent to  the
       server in clear, as plain text.

       The  consequence  is that if you use a valuable password - for instance
       the one you use to log in on your computer  -  the  guy  who  runs  the
       server  will  see  your  password  in  the  log  file  if he wishes to.
       Therefore, use something weak, something that  if  someones  finds  out
       what it is, you won’t really care. So "hello" is a wise choice.

       Is Liquid War likely to have security holes?


       Any  program  is  likely  to  have security holes, especially when it’s
       networked. However, I have good reasons to think  that  Liquid  War  is
       safe  enough  for  a  game.  At  least  I  find it safe enough to run a
       permanent public server on my personnal computer 8-)

       FYI, here are some things which I think make Liquid War rather safe  to

       *  Liquid  War  does  not  store anything on your hard drive that would
          have been received from the network. The maps are kept  in  RAM.  So
          you won’t download any virus playing Liquid War on Internet.

       *  Liquid  War  does  not transmit any sort of code on the network. All
          the transmitted bytes represent plain data. So you’re not likely  to
          execute  any arbitrary code - virus, worm - when playing on the Net.

       *  Liquid War receives network packets in static buffers,  and  if  the
          received  data  is too big, it is truncated. One consequence is that
          Liquid War has a bunch of "limits". You can’t send hudge  maps  over
          the  network,  you can’t have long nicknames, and so on. But another
          consequence is that if you try to send garbage  in  the  buffer,  it
          will  be  truncated.  Liquid War will protest with a "network error"
          message and the connection will be closed, but there will be no easy
          exploit possible here.

       *  Liquid  War  does  not use the sprintf, strcpy and strcat functions,
          which are known as being rather unsecure  since  they  can  lead  to
          buffer   overflows.   Instead,  it  uses  the  equivalent  functions
          snprintf, strncpy and strncat. On platforms  where  these  functions
          are  supported  natively,  the  game  will  use  the  default system
          functions, otherwise it will  use  a  free  implementation  by  Mark
          Martinec.  FYI,  Windows  does  not  support snprintf-like functions
          natively, that is, it’s a piece of crap.

       *  Liquid War is Free Software, so I’m not likely to have put backdoors
          in it myself, since anyone can look at the source code 8-)

       However,  I  have  not - and I know nobody who has - audited Liquid War
       for security holes. So  there  might  be  some.  Therefore  you  should
       respect a few things while running Liquid War:

       *  Never run Liquid War as root or administrator. This is obvious but I
          still mention it. If you want to run a Liquid War  daemon  on  UNIX,
          run  it  as  user  "nobody"  or  something approaching. If "root" or
          "administrator" does not make sense on your system  (DOS,  Win98...)
          then  I  assume  you’re not _really_ concerned about security anyway

       *  If you run a  server  7/7  24/24,  use  the  "-log"  option  to  log
          everything  in  a  file.  This  way  you’ll  keep a trace of network
          activity, and if something goes wrong, you might get a chance to see

       *  If  you  use  passwords  in network games, *never* choose a valuable
          password. Use something simple like "hello" or "goodbye".

       *  Keep in mind that Liquid War is a  game,  and  not  a  bullet  proof
          professionnal server.

       Last  point:  you  should be aware that version 5.4.5 of Liquid War has
       been proved to be vulnerable to a local buffer overflow, and one should
       run  at  least  5.5.9  to  get rid of this problem. FYI by the time the
       exploit  was  found  on  5.4.5,  5.5.9  was   already   out   8-)   See                               and for more informations.

       Can people cheat when playing on the Net?


       Or at least, not really. In fact, you  can  still  find  the  following
       types of lamers:

       *  A guy who lets the CPU play at his place. He’ll loose anyway because
          the CPU is definitely not a great Liquid War Master 8-)

       *  A guy who tweaks the game and gets all  his  bots  fight  anyone  he
          wishes. That’s mean.

       *  A  guy  who  manages to let you have a 500msec lag while he does not
          have any lag at all.

       Apart from this, I can hardly see any way to cheat.  Why?  Because  the
       Liquid  War  server does not store any information about the game. It’s
       not aware of who wins, who looses, it knows nothing. The only thing  it
       does is to transmit key presses between client computers.

       This  way,  if  someone  plays  with  a  tweaked release of Liquid War,
       thinking he will fool you, then  he  will  fool  you  on  his  computer
       only...  On  your  computer,  everything will be fine. After some time,
       your screen and his screen  will  have  nothing  in  common,  and  both
       players are likely to think they have won. Except the lamer will stay a

       This also explains why  it’s  required  to  play  with  the  very  same
       versions  of  the game during network games. If you plug a 5.5.2 with a
       5.5.1, after a minute the screens will be completely different on  each
       client,  since  there  are subtle differences between the 5.5.1 and the
       5.5.2 engine. However, you shouldn’t  be  able  to  do  this,  since  a
       network error will stop you before you can start to play.

       Additionnally,  versions 5.5.5 and higher have a checksum system. Every
       100 rounds, each client calculates a checksum with its local  map,  and
       sends  it  to the server. If the checksum is incorrect, the server will
       log a message like:

       Checksum error on client ""

       If you see this, then you’re in one of the following situations:

       *  There’s a bug in the game

       *  A lamer tries to cheat

       FYI, all releases from 5.4.0 to 5.5.4 have a bug which  causes  clients
       to desynchronize after a while...

Command line parameters

       When  you launch Liquid War 5, you can use command line options. If you
       have no problems launching Liquid War, this section should not interest
       you very much.

       You  can  use  several  options  at the same time. The basic syntax for
       options looks like this:

       lw -option1 -option2 parameter2 -option3 parameter3 -option4 -option5

       Note that most of the options are legacy options  which  where  usefull
       with  the  initial  releases  of  Liquid  War, when you had to run in a
       Windows DOS box, and when there were still plenty of 486 computers with
       only 8Mb ram...

   Version checking
       These  are  basic  options  which  can  be  usefull to figure out which
       release of Liquid War is installed.

       *  "-v" : returns the version number of the program.

       *  "-h" : displays a short description and copyright information.

   Changing default paths
       Very usefull options, especially if you can not install Liquid  War  in
       default directories or want to put the game in a special place.

       *  "-cfg  myconfigfile.cfg"  :  causes  Liquid War to use the specified
          config file.

       *  "-dat mydatafilefile.dat" : causes Liquid War to use  the  specified
          datafile.  This might be a very interesting option if you run Liquid
          War on a GNU/Linux box  where  you  do  not  have  root  access  and
          therefore can not put the datafile in /usr.

       *  "-map  mycustommapdir"  :  causes  Liquid  War  to use the specified
          directory as the user map directory. The user map directory is where
          you can put plain bitmaps to be used as maps.

       *  "-tex  mycustomtexturedir"  : causes Liquid War to use the specified
          directory as the user texture directory. The user texture  directory
          is where you can put plain bitmaps to be used as textures.

       *  "-mid  mycustommusicdir"  :  causes  Liquid War to use the specified
          directory as the user music directory. Any midi file placed in  this
          directory will be added to the list of available musics.

       *  "-server  myliquidwarserverfile"  :  causes  Liquid  War  to use the
          specified file as the server executable. This option has  no  effect
          for now since the server is not launched by the client.

       *  "-mapgen  mylwmapgenfile"  :  causes Liquid War to use the specified
          file as the "lwmapgen" executable. "lwmapgen" is an utility by David
          Redick which generates random maps automatically for Liquid War. You
          might wish to change this option if random map generation  does  not
          work  for some reason, or if you want to use your own map generator.

   Troubleshooting switches
       These options give you control on how Liquid War treats  initialisation
       errors,  how much memory it should reserve, what kind of video mode sit
       should not choose etc...

       *  "-vga" : This option forces Liquid War to use your video card as  if
          it  was  only  a basic VGA card. This option is required if you play
          Liquid War from Windows NT.

       *  "-no400300" : This option disables the VGA  400x300  video  mode.  I
          created this options for I know that some video cards/monitors don’t
          support the 400x300 mode.

       *  "-silent" : With this option, Liquid War will not play any sound. It
          will  not  search for any sound card. This can be interesting if you
          don’t have any sound card or if Liquid War doesn’t handle your  card

       *  "-nowater" : Causes Liquid War not to load any water sound. Use this
          if Liquid War runs short of memory, and you should gain about 850kb.

       *  "-nosfx"  :  Causes Liquid War not to load any sound fx. Use this if
          Liquid War runs short of memory, and you should gain about 150kb.

       *  "-nomusic" : Causes Liquid War not to load any midi music.

       *  "-mem n" : The parameter "n" sets  the  amount  of  memory  (in  Mb)
          Liquid  War  will allocate to do all its calculus. If this number is
          too small, you won’t be able to play on all the levels. If it is too
          high,  Liquid  War  may  not  start  at  all  or crash while you are
          playing. The default value is 8. If you play Liquid War from Windows
          and  Liquid  War  refuses to run because this parameter is too high,
          then try and give more dpmi memory to Liquid War.

       *  "-nojoy" : This option disables joystick support.

       *  "-noback" : Causes Liquid War not to load the background image.  Use
          this  if  Liquid War runs short of memory, and you should gain about

       *  "-notex" : Causes Liquid War not to load any texture.  Use  this  if
          Liquid War runs short of memory, and you should gain about 750kb.

       *  "-auto"  :  If  you  set  this option, Liquid War won’t generate any
          error while allocating memory or loading data.

       *  "-safe" : With this option,  you  will  play  with  a  very  reduced
          version of Liquid War. It looks rather ugly but should work in a DOS
          box with only 4Mb of DPMI memory. Use this if you experience serious
          memory  or  device  problems.  If Liquid War doesn’t start with this
          option turned on, I really don’t think I can do anything for  you...

       *  "-nice"  :  With  this  option,  Liquid War will use a mode which is
          between the default mode and the "safe" mode.

       *  "-check" : With this option, Liquid War will  stop  as  soon  as  it
          detects something strange while initializing.

       *  "-stop"  :  If you set this option, Liquid War will prompt you for a
          key when the init process is completed.

       *  "-c" : This is a weird option, if you turn it on, the game will only
          use  fonctions  which  are  programmed  in  C  langage.  The default
          behaviour is to use some functions I rewrote in assembly langage, so
          that the game is a little faster.

   Debug options
       These  options  are  usefull  if  you  want to debug the game and trace
       what’s happening.

       *  "-netlog" : Dumps all the network traffic on  the  standard  output.
          This  can help finding problems when trying to connect to the server
          in a network game.

   Server options
       The server command line options are  described  in  the  section  which
       deals  which  network games in general. IMHO you need to understand how
       network works in LW before trying to tweak the server 8-)

   Other options
       Everything else 8-)

       *  "-capture" : Activates the capture mode. In this mode, the game will
          dump  a  .bmp  file  on  the disk several times per second, which is
          usefull if you want to create an mpeg movie  of  your  game  session
          afterwards.  You  can  also  activate  this  mode  interactively  by
          pressing F9 within the game.

       *  "-metaserver url" : redefines the URL of the meta-server. Usefull if
          you want to use your own meta-server.

       *  "-nobeep"  :  Disables  the  system beeps that the application might
          fire. These beeps are mostly used on the server  to  notify  clients

       *  "-tombola" : Activates a special mode where scores are not displayed
          normally. Instead, the game displays 3 random numbers  between  1  -

   lwmapgen options
       The  external  lwmapgen  program  by  David  Redick accepts a number of
       command line options. You can type:

       liquidwar-mapgen --help

       to get a list of all available options under UNIX.  Under  Windows  the
       command would be:

       lwwinmap --help

       Note that lwmapgen is called automatically by Liquid War when you click
       on the "Random map" button.

       The idea behind lwmapgen is that you choose a function which  sets  the
       type  of  map  generated,  and  then  pass  various  arguments  to this
       function. If you do not explicitly  choose  a  function,  one  will  be
       picked  up  for you randomly, and all other parameters will use default

       The most usefull and common options are:

       *  "--help" : displays help.

       *  "--out filename" : save bitmap to filename.

       *  "--size n" : bitmap size (an integer between 0 and 5).

       *  "--list" : list all available functions.

       *  "--function function_name" : which function to use.

       Here’s a typical use of lwmapgen:

       liquidwar-mapgen --size 3 --function hole --out test.bmp

Platform specific issues

   General remarks
       Liquid War is now a cross-platform game, thanks to Allegro. So now  you
       can play under different OS.

       The  same source tree will compile on all supported platforms, but with
       slight differences when running. C preprocessor #defines  are  used  to
       code  some  platform  specific  stuff,  and  in  some  cases  there are
       different files for the DOS, Windows and UNIX versions.

       As I said, I try to use the same code for all platforms. This is in the
       long  term the best choice. Otherwise there would different branches of
       the source tree, and I don’t think this is a very good solution.

       Therefore some optimizations that were performed in  the  old  DOS-only
       version  have  been  totally  removed,  for  they  were  100%  platform
       dependent (ie mode-X asm coding). So the new versions are all a  little
       slower  than  the old 5.1 stuff, but the performance loss is only about
       20%, which is  not  significant  with  today’s  PCs.  And  anyways  the
       performance  loss  is  most  of  the  time  limited to the goog old VGA
       320x200x8 mode-X, which starts being kind of obsolete.

       This is the original version. It’s the fastest one as far  as  I  know,
       the  safest  one and it will always be I think, since Allegro was first
       designed for DOS, and DOS allows a full unconditionnal  access  to  all
       the  hardware  ressources  LW  requires.  LW  doesn’t  use any hardware
       acceleration and it’s not been designed to do so. Unfortunately there’s
       no network support for the DOS version of Liquid War.

       When running under a Windows box, the DOS release used to be safer than
       the native Windows port. Now that DOS support is  getting  really  poor
       with  recent  versions of Windows, the native Windows release of Liquid
       War starts begin the good choice for Windows  users.  And  Allegro  for
       Windows is getting quite stable in the 4.x series.

       The  other reason to choose this release rather than the DOS release is
       that it has network support.

       If you have problems running Liquid War under Windows, please check out
       the "data\lwwin.log" file which should be written each time you run the
       game. It contains the information which is  displayed  on  the  console
       under  other  platforms,  and  might give you a clue about what’s going

       This port is the most recent one, and also the one I prefer. Paths have
       been changed to an UNIXish style, ie the data is stored in:


       the executable in:


       and the configuration file is


       Since  not  all  GNU/Linux distributions have /usr/local/games in their
       path, I also put a symbolic link to the binaries in  /usr/local/bin.  I
       believe   Liquid  War  is  quite  FHS  compliant,  so  if  its  default
       directories do not match your configuration, blame your distro for  not
       following  the  standards  8-)  AFAIK  the  only  touchy  directory  is
       /usr/local/share/pixmaps which I’ve seen on many distribution but  does
       not seem to be referenced in the FHS.

       With  the  latest  releases  of  Allegro, Liquid War is becoming pretty
       stable under GNU/Linux. You should also know that the GNU/Linux port is
       usually  the  most up to date, since I very very seldom boot Windows at
       home and do most of the coding under GNU/Linux.

       This is the latest port, so I expect  it  to  be  a  little  touchy  to
       install and/or run for some time.

       Note  that  to  compile  the game you’ll need to install GNU tools like
       gmake and gcc. Liquid War won’t compile with the genuine  make  and  cc

       One  thing  you might ask is: "why do you provide the binary as a plain
       .tgz file, it would be much  nicer  if  a  standard  FreeBSD  port  was
       provided  instead!".  The  answer  is that the statically linked binary
       should work flawlessly and does not raise any dependency problem.  Also
       I  don’t  know  how to make a BSD port and I’m not really interested in
       doing it. If it’s easy to do, then someone can simply do it and send it
       back  to me. If it’s hard to do, then I do not really have the time nor
       motivation to do it. What I did is make the code  and  install  scripts
       FreeBSD friendly so that it would be possible to compile the game under
       FreeBSD. Packaging is another story.

   Mac OS X
       There’s currently a beta version of a Mac OS X  port  for  Liquid  War.
       Ryan  D.  Brown nicely managed to compile and run the game under Mac OS
       X, and the latest news was that it does  basically  work.  Still,  this
       port did not go through intensive testing, so there might still be some
       bugs, expecially concerning networking.

       There were some  byte  endianess  problems  in  previous  (  <=5.5.8  )
       releases of LW, but I tried to fix them and they should be gone now.

       As  of  today, we’re trying to find out a convenient way to package and
       release the Mac OS X version of LW. You can contact us on  the  mailing
       list if you’re interested in this port.

User levels

   A piece of advice
       You can use your own levels whith Liquid War 5. The only thing you have
       to do is to  put  your  own  256-colors  vbitmap  files  in  a  special
       directory, and the program will use them. Currently, BMP, LBM, PCX, and
       TGA files are supported. It is a good thing to use 256 colors  bitmaps,
       for they waste less disk space than truecolor bitmaps, and Liquid War 5
       converts all bitmaps to 32  colors  bitmaps.  Additionnally,  truecolor
       bitmaps  might  cause  the  DOS  version  to  crash randomly... 2-color
       bitmaps will also cause the program to crash. I warned you!

       The best thing you can do to create your user levels is to have a  look
       at  the  few  user  files I put in the .zip file and try at first to do
       something that looks about the same!

       Liquid War 5 does many checks on user levels and  is  much  safer  than
       Liquid  War  3.  Still,  try  and  help  the  program  not to crash, if

       Liquid War considers that dark colors are walls and bright  colors  are
       associated  to  the playable area. So you can draw your walls in black,
       dark blue, etc... And the rest of the map can be of  any  bright  color
       such as white or yellow.

       You  can  draw a small map on a big bitmap, as long as you use a bright
       background color. Liquid War will autodetect the range of your map  and
       add the border line if necessary.

       Liquid War re-orders all the maps, so that the smallest ones are on the
       left and the most complicated ones on the right when  you  choose  them
       with  the  slider  in  the "map" menu. So if you can’t find the map you
       just draw, don’t worry, it is probably just mixed with the levels  from
       the .dat file.

       The   default   path   for   maps  is  "custom\map\"  on  windows,  and
       "/usr/local/share/games/liquidwar/map" on GNU/Linux.

       All you have to do is put a bitmap in the default  directory  which  is
       "custom\texture\"              on              windows,             and
       "/usr/local/share/games/liquidwar/texture" on GNU/Linux.

       As of Liquid War 5.6.x,  it’s  possible  to  associate  a  map  with  a
       texture.  All  you need is to call the maps with the same name (case is
       important, lowercase recommendend...). Look at  the  "meditate"  custom
       map which is shipped with Liquid War for instance.

       This  also  works  with  internal  builtin  maps  (those  stored in the
       datafile) so for instance if you name a custom texture "world1.bmp"  it
       will  automatically  be associated to the builtin map world1 (to figure
       out internal names you have to unpack the source distribution and  look
       in  the ./data directory). This also works the other way, if you name a
       map "wood2.bmp" it will be automatically associated  with  the  builtin
       texture wood2.

       Associating  a  texture  with a map requires more work than designing a
       simple map, but the results is usually much nicer. See  the  "Kasper  -
       ..." series of maps for instance.

   Send your levels
       Maybe  you  will find that the original levels are ugly and unplayable.
       Well, if you have made user levels and think they are great, just  send
       them  to  the  Liquid War user mailing list. Please use only 256 colors
       bitmap and zip them before sending them, or else they might be  blocked
       by my provider...

       As  of  today, dozens of user maps have already been included in Liquid
       War, this is very nice for it happens that every map designer  has  his
       own personnal tastes, so the maps all look different.

       Still,  to  be  included  in Liquid War’s mainstream distribution, your
       maps will need to be placed under the terms of the GNU  General  Public
       License,  or  at least a compatible license. You should have received a
       copy of this license with Liquid War anyway. Read it 8-)

       Of course, you can use *any* map when playing. You can even play with a
       bitmap  you got from a proprietary source - such a proprietary game you
       bought for instance - but the point is that I can’t  -  and  you  can’t
       either - distribute such a map along with Liquid War.

       However,  this  is  enough  legal boring stuff! What you should keep in
       mind is that I’m always happy when I receive  maps  from  players,  and
       it’s  a pleasure for me to include them in the mainstream distribution.

Core algorithm

       General remarks

       If you have played Liquid War, you must have  noticed  that  your  army
       always  takes  the shortest way to reach the cursor. So the fundamental
       stuff in Liquid War is path-finding. Once you’ve done that the game  is
       quite  easy  to code. Not harder than any other 2D game. Still the path
       finding algorithm is an interesting one, for it’s not a  common  method
       that we used.

       Basically,  at  each round (by round I mean a game logical update, this
       occurs 10 or 100 times/sec depending on the level and/or your machine),
       the  distance  from  all  the  points  of  the  level to your cursor is
       calculated. Now the point is to calculate  this  fast,  real  fast.  In
       fact,  a  "gradient" is calculated for all the points of the level, and
       the value of this gradient  is  the  distance  required  for  a  little
       pixel/fighter to reach your cursor, assuming that he takes the shortest
       way. Liquid War does this with a 10% error tolerance, and  it’s  enough
       for keeping the game interesting.

       Once  you  have  this  gradient  calculated, it’s not hard to move your
       fighters. Basically, you just have to move  them  toward  the  adjacent
       point  that  has  the  lowest gradient value, ie is the closest to your


       The Liquid  War  algorithm  has  been  invented  by  my  friend  Thomas
       Colcombet In fact the Liquid War algorithm has been invented before the
       game itself. The game came as a consequence of the algorithm,  he  just
       thought "mmm, cool, we could make a game with that!".

       Later, I enhanced the algorithm, as I coded it. The consequences were a
       performance increase, especially on  simple  but  big  levels.  I  mean
       levels  with  wide  areas  for  teams  to  move. Still the basis of the
       algorithm remained the same.


       The Liquid War algorithm for path-finding is very efficient:

       *  When you have to move lots of different  points  toward  one  single
          point. Good thing that’s the rule of Liquid War!

       *  When  you  have no clue about how your map will look like, ie if the
          walls are randomly placed.  The  complexity  of  the  level  doesn’t
          influence  much  the  speed of the algorithm. The size does, but the
          complexity, ie the number of walls, is not so important.


       The Liquid War algorithm is very  poor  compared  to  other  algorithms

       *  You have several target destinations, that’s to say Liquid War would
          be really slow if there were 100 teams with 10 players only.

       *  You want to move one single point only.

       *  > You want the exact (100% sure) path. In fact, this algorithm finds
          solutions  which  approach the best one but you can never figure out
          if the solution you found is the best, and the algorithm never ends.
          In  the  long  term,  the algo will always find the best solution or
          something really close but I don’t know any easy way to  figure  out
          when you have reached this state.


       The  first  Liquid  War  algorithm  used to calculate the gradient (the
       distance from a point to your cursor) for every  single  point  of  the

       With  Liquid  War  5,  I  used  a  mesh  system.  This mesh system is a
       structure of squares connected together. Squares may be 1,2,4,8  or  16
       units  large  or  any  nice  value  like that, and the gradient is only
       calculated once for each square. Squares have connections between them,
       and each connection is associated to a direction.

       There are 12 directions:

       *  North-North-West (NNW)

       *  North-West (NW)

       *  West-North-West (WNW)

       *  West-South-West (WSW)

       *  South-West (SW)

       *  South-South-West (SSW)

       *  South-South-East (SSE)

       *  South-East (SE)

       *  East-South-East (ESE)

       *  East-North-East (ENE)

       *  North-East (NE)

       *  North-North-East (NNE)


       Well,  let  me  give you an example, supposing that you level structure

       *        *
       *        *
       *       **
       *        *

       The * represent walls, that’s to say squares where fighters can not go.

       Then the mesh structure would be:


       In this mesh, there are 7 zones:

       *  zone  1 has a size of 4. It’s linked with zones 2 (ENE) and 4 (ESE).

       *  zone 2 has a size of 2. It’s linked with zones 3 (ENE,ESE), 5  (SE),
          4 (SSE,SSW) and 1 (SW,WSW,WNW).

       *  zone 3 has a size of 2. It’s linked with zones 5 (SSW), 4 (SW) and 2

       *  zone 4 has a size of 2. It’s linked with zones 2 (NNW,NNE), 4  (NE),
          5 (ENE), 6 (ESE) and 1 (WSW,WNW,NW).

       *  zone  5  has  a  size of 1. It’s linked with zones 3 (NNW,NNE,NE), 7
          (SE), 6 (SSE,SSW), 4 (SW,WSW,WNW) and 2 (NW).

       *  zone 6 has a size of 1.  It’s  linked  with  zones  5  (NNW,NNE),  7
          (ENE,ESE) and 4 (WSW,WNW,NW).

       *  zone  7  has  a  size  of  1.  It’s  linked  with zones 5 (NW) and 6

       Why such a complicated structure?

       Because it allows the module which calculates the gradient to work much
       faster.  With  this  system,  the number of zones is reduced a lot, and
       calculus on the mesh can go very fast. At  the  same  time,  this  mesh
       structure  is complicated to understand by us humans but it’s very easy
       for the computer.


       For each zone defined in the mesh, LW calculates an estimation  of  the
       distance between the cursor and this zone.

       The algorihm is based on the fact that to cross a zone which size is n,
       n movements are required. Easy, eh?


       Here’s the way the algorithm works:

       for each turn of the game, do:

       *  pick up a direction between the 12 defined directions. They have  to
          be  chosen  is  a  peculiar  order  to  avoid  weird  behaviors from
          fighters, but let’s suppose we just pick up the "next" direction, ie
          if WSW was chosen the last time, we pick up WNW.

       and then for each zone in the mesh, do:

       *  Compare  the potential of the current zone with that of its neighbor
          zone. The neighbor zone to be chosen is the one which corresponds to
          the  direction which has been previously picked up, and by potential
          I mean "the distance to the cursor,  estimated  by  the  algorithm’s
          last pass".

       *  If potential_of_the_neighbor_zone > (potential_of_the_current_zone +
          size_of_the_current_zone)  then   potentiel_of_the_neighbor_zone   =
          potential_of_the_current_zone + size_of_the_current_zone

       How can this work?

       Well,  just  ask  my friend thom-Thom, he’s the one who had the idea of
       this algorithm!

       The basic idea is that by applying this simple rule to all  the  zones,
       after  a  certain  amount of time, it’s impossible to find any place in
       the mesh where the rule is not respected. And at  this  time,  one  can
       consider the potiential is right in any point.

       Of  course  when the cursor moves the potential has to be recalculated,
       but you see, cursors move really slowly in Liquid War, so the algorithm
       has plenty of time to find a new stable solution...


       It’s possible to see this algorithm working by typing:


       while  playing,  where  [n]  is  the number of the team the gradient of
       which you want to view. The game is still running but you view a team’s
       gradient  being calculated in real time instead of seeing the fighters.

       If you type ufootgrad0 the display comes back to normal mode.


       Once the gradient is calculated for any zone on the  battlefield,  it’s
       quite easy to move the fighters, hey?

       The following method is used to move the players:

       *  A  "main  direction"  is  chosen  for the fighter, this direction is
          chosen using the gradient calculated on the mesh.

       *  Knowing which direction is the main one, a "level  of  interest"  is
          applied to the 12 defined directions.

       There are 4 "level of interest" for directions:

       *  Main directions: the direction calculated.

       *  Good  directions:  these  directions  should lead the fighter to the

       *  Acceptable directions: ok, one can use  this  direction,  since  the
          fighter shouldn’t loose any time using it.

       *  Unpossible directions: wether there’s a wall or using this direction
          means the fighter will be farer from  his  cursor  than  before,  it
          always means that this direction will not be used, never.


       The  fighters will try to find any matching situation in this list, and
       chose the first one.

       *  The main direction is available, no one on it, OK, let’s follow  it.

       *  There’s a good direction with no one on it, OK, let’s follow it.

       *  There’s  an acceptable direction with no one on it, OK, let’s follow

       *  The main direction is available, but there’s an opponent  on  it,  I
          attack!  By  attacking,  one  means  that energy is drawned from the
          attacked fighter and transmitted to the attacker. When the  attacked
          fighter dies, he belongs to the team which killed him.

       *  A  good  direction  is  available,  but there’s an opponent on it, I

       *  The main direction is available, but there’s a mate on  it,  I  cure
          him.  That’s to say that energy is given to the mate. This way, when
          there’s a big pool of fighters from the same team, they  re-generate
          each other.

       *  None of the previous situations found, do nothing.

       Tips and tricks

       The  behavior  of the armies is quite tricky to set up. I had myself to
       try many algorithms before I came to something nice. In fact, I had  to
       introduce  some  "random"  behaviors.  They are not really random for I
       wanted the game to behave the same when given the same keyboard  input,
       but for instance, fighters will prefer NNW to NNE sometimes, and NNE to
       NNW some other times. By the way, I think Liquid War could stand  as  a
       nice example of the thoery of chaos.

Source code

   General remarks

       Liquid  War  5  is  basically a big C program. I’ve splitted the source
       code in many small files for I do  not  like  to  have  to  handle  big
       monolithic  sources, but this does not mean Liquid War is very modular.
       In fact Liquid War 5 is quite bloated with global variables  and  other
       ugly stuff 8-(

       Coding style

       To be honest, it’s a big mess. You won’t find 2 files coded in the same
       maner... OK, I’m exagerating a bit. From now I try to  make  an  effort
       and stick to basic rules such as:

       *  use the GNUish-style indentation - the default Emacs mode in fact

       *  prefix  global  functions  /  variables  /  constants  /  types with
          lw_<NAME_OF_THE_file>_. For instance, a "do_it" function in myfile.c
          will be called lw_myfile_do_it

       *  use  capitals  for  constants, globals and types only. All functions
          are in lowercase with "_" to separate words

       *  keep on using 8.3 filenames for .c source files. This is for  better
          DOS  integration. DOS version of Liquid War is still maintained, you
          know 8-)

       *  use English only for code and comments

       I might decide to rename and cleanup everything some day, for it  would
       help  other  coders  to  understand  what  I  wrote,  but well, this is
       certainly not a thrilling task 8-/

   Source files organization
       Main game code

       Here  you’ll  find  the  main()   function,   the   main   game   loop,
       application-wide constants and other global stuff.

       It might be a good start if you want to hack the code.

       *  base.h: contains global constants used in many different files.

       *  game.c / game.h: contains the main game loop.

       *  main.c  /  main.h:  the  file where the main C function is declared.
          Doesn’t contain much except calling init functions and  running  the


       The  menus are coded using the Allegro GUI system. While this system is
       very powerfull, it’s IMHO not adapted to very complex GUIs, and one  of
       its  drawbacks  is  that  it’s  not  so easy to redesign something once
       you’ve coded it.

       Besides, when I started coding the GUI in 1998, I did it  in  a  rather
       ugly  way,  and  now I’m paying for my being lazy at that time, since I
       spent hours coding when I want to change something 8-/

       *  about.c / about.h: contains the code for the about menu.

       *  advanced.c / advanced.h: contains the GUI advanced options menu.

       *  connect.c / connect.h: contains code for the  "connect"  menu  which
          displays  which players are connected to the server, before the game
          actually starts.

       *  controls.c / controls.h: contains the code for the controls menu.

       *  graphics.c / graphics.h: code for the graphic options menu.

       *  internet.c / internet.h: contains  the  code  for  the  "Search  for
          Internet  games"  menu,  where  one  can  pick  up  a running server
          automatically with the help of the meta-server.

       *  language.c / language.h: contains the code for the "Language"  menu.

       *  level.c  /  level.h: contains code for the menu where the player can
          select a level and its options (texture or color).

       *  menu.c / menu.h: contains the code for the main menu.

       *  netgame.c / netgame.h: contains the code for the net game menu.

       *  options.c / options.h: contains the code for the options menu.

       *  play.c / play.h: contains the code which ties the menu to  the  main

       *  rules.c / rules.h: code for the rules menu.

       *  score.c / score.h: functions to display the scores at the end of the

       *  speeds.c / speeds.h: contains the code for the speeds menu.

       *  team.c / team.h: code for the team  menu,  where  one  choses  which
          teams will play.

       *  volume.c / volume.h: code for the sound menu.

       *  wave.c / wave.h: code for the wave menu.

       GUI tools

       These files contain various utilities which are used in the menus.

       *  alleg2.c  /  alleg2.h:  contains  some  tweaked allegro functions. I
          wanted to use bitmaps with sevral colors for my  fonts,  and  change
          some  of  the allegro default behavior. So rather than modifying the
          allegro source code right in the library I copied it  in  this  file
          and then modified it.

       *  back.c / back.h: this modules displays the background image.

       *  dialog.c / dialog.h: contains code for standard dialog boxes.

       *  error.c / error.h: contains functions to display error messages once
          the game is in graphical mode.

       *  help.c / help.h: generic  functions  to  display  the  various  help

       Core algorithm

       Here’s  *the*  interesting part. All the rest of the code is just sugar
       coat to display stuff, receive players commands, communicate with other
       computers, handle errors, etc... But the real thing is here!

       It’s funny to note that these files have almost not been modified since
       Liquid War 5.0.

       It’s also interesting to note that they represent a small percentage of
       the  total  amount  of  code in the game. This tends to prove - and I’m
       convinced of it - that game  programming  does  not  only  consists  in
       having great ideas, but also requires a lot of "dirty" and boring work.
       Honestly, coding an option menu is  as  boring  as  coding  Liquid  War
       algorithm is fun.

       *  fighter.c  /  fighter.h:  contains code to move the armies, once the
          gradient has been calculated.

       *  grad.c / grad.h: this module calculates the gradient for each  team.
          One  could  say it’s the "kernel" of the game, since most of the CPU
          time is spent in this module (except if you have a slow display...).

       *  mesh.c  /  mesh.h: contains code to set up a usable mesh with a map.
          Mesh are re-calculated at each time  a  new  game  is  started,  the
          reason  for this being that meshes are *very* big so it would not be
          reasonnable to save them directly on the HD.

       *  monster.s / monster.h: assembly functions to speed-up the game. It’s
          a replacement for some fighter.c functions.

       *  spread.s   /  spread.h:  contains  assembly  replacements  for  some
          functions of  grad.c.  These  replacements  do  the  same  than  the
          original ones from grad.c, but faster. Could still be optimized.

       Moving cursors

       It looks like nothing, but moving a cursor and deciding where it should
       go if there’s a wall in front of it is not that easy, especially if you
       want things to work nicely.

       *  autoplay.c / autoplay.h: contains the code for the computer AI. This
          module simulates keypresses from the computer, then the computer  is
          handled as any other player.

       *  move.c / move.h: provides an API to move the cursors.

       User input

       Until 5.4.0, Liquid War did not have network support. As it is designed
       to be multiplayer, one needed to  have  several  players  on  the  same
       computer.  The  mouse  also needed to be handled in a special way since
       cursors can *not* pass walls in Liquid War. Additionnally, I wanted all
       input channels (keyboard mouse and joystick) to be handled in a unified

       This explains why there’s so much code for user input, when  one  would
       think at first sight that "polling the keyboard is enough".

       *  joystick.c / joystick.h: contains code to support joystick input. It
          wraps joystick buttons to virtual keyboard keys,  so  that  joystick
          and keyboard behave exactly the same.

       *  keyboard.c / keyboard.h: contains code to handle key presses.

       *  mouse.c  /  mouse.h:  wraps  the mouse movements to virtual keyboard
          keys. This way the mouse can be used to control the players.


       These files contain functions to  intialize  various  game  components.
       100% boring code.

       *  area.c  /  area.h:  contains  functions  to  create  the  game area.
          Basically it contains functions to create  the  data  structures  in
          which the level is stored during the game.

       *  army.c  /  army.h: functions to create the armies, and place them on
          the battlefield.

       *  asm.c / asm.h: various constants, macros  and  utilities  to  ensure
          that asembly code works correctly.

       *  bigdata.c  /  bigdata.h:  I  had  a really hard time with the malloc
          function with DJGPP under Win95 dos box. I tried to have it  working
          for hours and hours but my program kept being buggy. So I decided to
          allocate the memory myself, in a memory zone I  create  at  startup.
          This  is  what  this module does: create a huge memory zone and then
          give parts of it to the rest of the program.

       *  config.c / config.h: contains everything that is related to the game
          configuration.  This  module  contains  in  global variables all the
          parameters that are stored in the config file.

       *  cursor.c / cursor.h: contains the code to init the cursors and place
          them on the battlefield at the beginning of the game.

       *  decal.c  /  decal.h:  This  module  makes the link between teams and
          players. Its coding is quite ugly, for some  modules  in  LW  assume
          that when 2 teams are playing they are always teams 0 and 1. So when
          3 teams are playing are playing and the second team loses,  one  has
          to make team 2 become team 1. That’s what this module is for.

       *  exit.c  / exit.h: contains code that is executed when the game ends,
          it shuts down Allegro and displays messages on the console.

       *  gfxmode.c / gfxmode.h: contains code to set  up  the  various  video
          modes, and defines which modes are available for each platform.

       *  init.c  /  init.h:  contains  code to initialize Allegro with proper
          options and analyze failures.

       *  palette.c / palette.h: contains function to set up the current color
          palette.  Liquid  War  uses  different  palettes,  depending on what
          colors are chosen for teams.


       Here lies most of the graphic functions in Liquid War. There’s not that
       much  code  since  Liquid War’s strength is not its visual effects, but
       rather its gameplay.

       The only "funny" thing is the wave effect. I’m quite happy with it, and
       honestly,  I do think it is rather fast, given the fact that it uses no
       3D hardware at all.

       *  disp.c / disp.h: contains functions to display the battlefield.

       *  distor.c / distor.h: this module contains code to create  the  "wave
          effect".  It  uses a lot of data tables, and is quite complicated to

       *  glouglou.s / glouglou.h: assembly module, it is  a  replacement  for
          some functions of distor.c. It goes much faster but does the same.

       *  info.c / info.h: contains code to display the info bar. The info bar
          is the bar which display the time left and the amount of players for
          each team while the game is running.

       *  message.c  /  message.h:  provides an API to display messages during
          the game. Very useful if you want to debug the game: you  can  trace
          and display anything.

       *  pion.c / pion.h: contains code to display the cursors.

       *  viewport.c  /  vieport.h: code to allocate and resize the zone where
          the map is displayed, also called "viewport".

       Sound and music

       Sound and music routines required some encapsulation,  since  the  game
       must  be  able  to  run  even  if  the  sound and/or music did not load

       *  music.c / music.h: contains the code to control MIDI playback.

       *  sound.c / sound.h: functions to play sound.

       Data management

       These functions handle the datafile contents and also the custom  data.

       Note  that the various utilities such as liquidwarcol, liquidwarmap and
       liquidwartex do not share  code  with  the  main  executable.  This  is
       obviously  a  design error, for liquidwarmap will handle maps in a very
       poor way and is unable to autodetect map errors, whereas the game  does
       it rather well. Blame the programmer.

       *  disk.c  / disk.h: contains all the code to access data from the hard
          drive. In fact, all the HD access is done at startup.

       *  map.c / map.h: contains code to load the maps from  a  datafile  raw
          data or a user defined bitmap to a usable structure in RAM.

       *  maptex.c  /  maptex.h:  contains  code  to  handle  the "use default
          texture"  option,  and  associate  a  map  with  a   given   texture

       *  texture.c  /  texture.h:  contains code to handle textures. Textures
          are stored in a special format which uses 5 bits per pixel.

       Random map generator

       Liquid War has a "generate  random  map"  feature  which  is  available
       within  the  game  and also as an external program. The source code for
       the external program  is  in  ./utils/lwmapgen  in  Liquid  War  source
       distribution.  This  program  has  been  coded by David Redick, is also
       available on and works  on
       GNU/Linux.  Compiling this program under DOS and/or Windows is untested
       and unsupported.

       The random map generator within Liquid War - which of course  works  on
       any  platform support by LW - uses for its greater part the same source
       code as the external lwmapgen program.

       *  random.c / random.h: wrapper for the map generator written by  David
          Redick. It basically does the same as ./utils/lwmapgen/main.c except
          that it does it within Liquid War as it is running  and  not  in  an
          external independant program.

       Time handling

       Time handling is fundamental in a game. Time is used for visual effects
       (waves...) during the game, it’s used to generate  some  pseudo  random
       stuff, well, it’s used everywhere!

       Note  that  on the client, I use 2 "different" clocks. The first counts
       the "real" time, in seconds. The second one is counts "rounds"  and  is
       incremented by 1 at each game round.

       *  srvtime.c / srvtime.h: code used to handle time on the server, where
          Allegro’s functions are not available.

       *  ticker.c / ticker.h: sets up a timer callback.

       *  time.c / time.h: functions to  know  how  long  the  game  has  been
          running, knowing that it can be interrupted.

       In-game utilities

       These  are  various utilities use to monitor and control the game while
       one’s playing.

       *  capture.c / capture.h: code used to capture the video output of  the
          game and store it in .bmp files while playing.

       *  checksum.c  /  checksum.h:  utilities  to generate a checksum from a
          given game state. Used in network code to make sure all the  clients
          stay synchronized.

       *  code.c  /  code.h: This file contains the code to handle key presses
          during the game. That’s to say the pause key for instance.

       *  profile.c / profile.h: provides tools to calculate how fast the game
          is runnning and what operations slow it down.

       *  watchdog.c  / watchdog.h: this module waits for "secret codes" to be
          typed while the game is running, and traps them.

       Command line handling

       OK, now to all the UNIX guys, I *know* there are many ways to do things
       in  a  better and simple way than I did. But keep in mind that in 1998,
       under DOS, I had a rotten command line and even now I  need  everything
       to work on both UNIX and Microsoft platforms.

       These  utilities are not perfect, but they work, that’s all I ask them.

       *  basicopt.c / basicopt.h: handles basic command line parameters  such
          as "-v" or "-h".

       *  parser.c  / parser.h: contains code to parse and analyze the command
          line parameters.

       *  startup.c / startup.h: analyzes  the  command  line  parameters  and
          stores them into global variables.

       Locale support

       Liquid  War now has locale support. Basically, all the labels and texts
       in the UI are stored in constants. There’s simply file per language.

       Note to translators: if you decide to translate the  menus  in  another
       language,  keep  in  mind  that  all  the  translations must fit in the
       various buttons and textboxes. The best resolution to test this  -  the
       one where letters take most place - is 640x480.

       *  lang.c / lang.h: contains code to handle language dependant stuff.

       *  langen.c / langen.h: contains code to handle English specific stuff.

       *  langfr.c / langfr.h: contains code to handle French specific  stuff.

       Log and various messages

       OK,  the API of the log routines is a piece of crap. Now I’m simply too
       lazy to change it. It works, that’s all I ask.

       BTW, there’s a clear  advantage  in  using  custom-made  log  functions
       instead of plain calls to "fprintf(stderr,...". It might not be obvious
       for UNIX users, but think about  Windows.  Nothing  like  a  "tail  -f"
       there,  nor  a  proper output redirection system. When a user clicks on
       the Liquid War icon, I want "console" information to  be  logged  in  a

       *  log.h: common header for logcli.c and logsrv.c.

       *  logcli.c:  contains  code  to  display messages on the console. It’s
          usefull for console may have different behaviors when the  games  is
          used  on  different  platforms.  This  file  is  used to compile the

       *  logsrv.c: contains code to display messages  on  the  console.  This
          file  is  used  to compile the server, which does not use Allegro at

       *  popupgen.h: common header for popup functions.

       *  popupw32.c: code to handle popup on the Win32 platform. Popups are a
          must-have  under  Windows  for  error diagnostics, since the average
          Windows user never gives any look at any log file...

       Macros, utilities and string support

       As usual, I needed to prepare a small set of usefull macros.

       *  macro.h: contains basic wrappers/macros for snprintf like functions.
          This  mostly to ease up string manipulation which is - as always - a
          nightmare in standard C.

       *  path.c / path.h: code  used  to  handle  filenames  and  paths,  for
          instance remove path and file extension from a filename.

       It’s  also  important  to note that Liquid War uses snprintf instead of
       sprintf, for using the latter is very likely to cause buffer overflows.
       Under Linux glibc provides this function but Microsoft does not provide
       it natively on  Windows.  Therefore  I  used  a  third  party  snprintf
       implementation  by  Mark Martinec:
       and its source is available in the  ./utils  directory  of  Liquid  War
       source distribution.

       Byte order and endianess

       As  you  might know, PC Intel based computers are "little-endian" while
       Sun Sparc stations and Mac computers are "big-endian". This is an issue
       for  LW  since  in network games maps are transmitted in binary format.
       Therefore I needed to set up some (un)serialization fonctions.

       *  serial.c / serial.h: code used to transform integers and map headers
          into an uniform cross-platform byte stream which is readable by both
          little and big endian machines.

       Thread support

       Liquid War does have thread support,  but  it  is  a  "limited"  thread
       support.  I  mean  that  the  game is generally monothreaded, but a few
       functions use threads. For instance, calls to the meta-server are  done
       within threads.

       Basically,  I  do  not  really  enjoy  programming  in  a multithreaded
       environnement. So when possible, I chose the monothread path, and  used
       threads  only  where  I  simply  would  not  be  able  to  find another
       acceptable solution.

       I also needed to use some  mutexes  to  prevent  crashes  in  the  user

       *  mutxdos.c:  provides  fake  mutex  support under DOS. This module is
          here only to make compilation easier.

       *  mutxgen.h: header for mutxdos.c, mutxunix.c and mutxw32.c.

       *  mutxunix.c: provides mutex support on UNIX.

       *  mutxw32.c: provides mutex support on Win32.

       *  thrddos.c: provides fake thread support under DOS.  This  module  is
          here only to make compilation easier.

       *  thrdgen.h: header for thrddos.c, thrdunix.c and thrdw32.c.

       *  thrdunix.c: provides thread support on UNIX.

       *  thrdw32.c: provides thread support on Win32.

       Launching external programs

       Liquid  War  might  sometimes  launch  external  programs. This is (for
       security reason) not a default behavior and has  to  be  activated  and
       configured  by  yourself,  using the "-callback" command line option on
       the server for instance.

       *  execgen.h: header for execunix.c and execw32.c.

       *  execunix.c: code to launch external programs on UNIX.

       *  execw32.c: code to launch external programs on Win32.

       *  exec2.c: code to launch external programs within the client, without
          any  interaction  with  the  user, ie no unwanted popping window for

       Low-level network code

       There are network packages for Allegro, but I decided not to use  them.
       Socket  support  is not that hard to implement under UNIX and Win32 and
       besides, I’ve done it for my job recently, so I just knew how to do it.

       Another  reason  which  decided me to code my own toolbox is that I did
       not want Liquid War to have external dependencies - except  Allegro  of
       course.  This  way, UNIX gamers to not have to set up and/or download a
       specific network library. It’s also easier to  integrate  the  game  in
       projects like Debian if it has few dependencies.

       This network code is not a masterpiece, it’s just a little set of tools
       that have proven to work. That’s all.

       BTW, it’s important to notice that  when  linking  with  Allegro,  most
       blocking UNIX calls ("sleep" or "recv" for instance) stop working: they
       alwasys return immediately. This led me to implement weird ugly  hacks,
       like  calling  "recv"  in a loop until it gets what it wants... This is
       theorically and practically a performance killer, but I found no  other
       way  to  fix  this. And FYI, this is not an Allegro bug, it’s a feature

       *  dnsutil.c / dnsutil.h: wrapper code to issue DNS  requests,  without
          having to handle the hostent struct.

       *  sock2cli.c:  sode  used  to  wrap  low-level network function on the

       *  sock2gen.h: header for sock2cli.c and sock2srv.c.

       *  sock2srv.c: code used to wrap  low-level  network  function  on  the

       *  sockdos.c: network API for DOS.

       *  sockex.c: netowrk routines shared by sockunix and sockw32.

       *  sockgen.h: header for sockdos.c, sockunix.c and sockw32.c.

       *  sockunix.c: network API for UNIX.

       *  sockw32.c: network API for Win32.

       High-level network code

       These files contains network utilities which are Liquid War specific.

       *  chat.c  /  chat.h: functions used to handle chat messages in network

       *  keyexch.c / keyexch.h: functions to send and  receive  keys  to  the
          server. Used on the client.

       *  netconf.c  /  netconf.h:  code to send and receive the config of the
          clients over the network.

       *  netkey.c / netkey.h: contains some tools to manipulate  key  strokes
          over the network.

       *  netmap.c  /  netmap.h:  code  to  send and receive the maps over the

       *  netmess.c / netmess.h: contains a parser  to  interpret  plain  text
          messages. Used when exhanging information over the network.

       *  netplay.c / netplay.h: contains the code to set up and start network

       *  network.c / network.h: contains some network related  functions  and
          constants used on the client.

       *  ping.c  /  ping.h:  code  used on the client to estimate the average
          ping time with a server.

       *  protocol.c / protocol.h: contains the sequence of messages send  and
          recevied by the client when connecting on the server.

       *  startinf.c  /  startinf.h:  contains struct and tools to handle some
          network informations while starting a network game.

       Communication with the meta-server

       The meta-server is called by both client  and  server.  Basically,  the
       server registers itself, and the client asks for a list of servers.

       The  meta-server  itself  is  just  a  set of simple PHP scripts with a
       simple MySQL database. I chose PHP because my provider allows execution
       of PHP pages, that’s all.

       The  protocol  is *very* basic, and uses HTTP 1.0 for requests. Answers
       are received in plain text, with one information per line.  There’s  no
       garantee  that  this  would  work  with any HTTP server, but experience
       proved that it works with my provider 8-)

       *  httputil.c  /  httputil.h:  low  level  functions  to  handle   http

       *  wwwcli.c / wwwcli.h: code used on the client to communicate with the

       *  wwwsrv.c / wwwsrv.h: code used on the server to communicate with the

       Server code

       The Liquid War server is a rather small program. The only thing it does
       is accept new players, transmit map and game parameters  between  them,
       and then "replicate keys".

       By  "replicate  keys" I mean that the server asks each client what keys
       have been pressed during the  last  round,  and  then  dispatches  this
       informations   to  all  clients.  This  implies  that  the  server  has
       absolutely no idea of who’s loosing, who’s winning, etc...

       All the "logic" of the server is coded in these files, the rest is only
       utilities and helper functions.

       *  server.c  / server.h: main code for the server (equivalent of main.c
          for the client).

       *  srvchan.c / srvchan.h: code used to handles channels on the  server.
          A  channel  is associated to a given computer and may manage several

       *  srvcont.c / srvcont.h: global network controler used on the  server.

       *  srvteam.c / srvteam.h: code used to handle teams on the server.


   Report a new bug
       If  you  have troubles with Liquid War 5, if you think it is a bug, and
       if it is not described in this file,  then  just  send  a  (precise...)
       decription of your problem to the Liquid War user mailing list.

       Besides,  it  happens  that  now  most bug reports come from the Debian
       tracking                                                         system
       "". Thanks to
       the Debian users and maintainers, it’s a very valuable feedback source.

       Additionnaly,  on  online  bug tracking system has been set up. It uses
       Flyspray     It’s     accessible      on                                     or
       "". I try to collect
       everything  here : bugs reported on the mailing-list, bugs from Debian,
       and bugs I found myself. Alternatively you can report bugs directly  on
       it 8-)

       Network support in Liquid War is far from being perfect, so there are a
       bunch of little problems which can appear. Basically, once the game  is
       correctly  started  on  a LAN, you should have no problems, but getting
       the game started might be difficult.

   Mouse does not work
       Some users reported that they were unable to  control  the  Liquid  War
       cursor with the mouse. Well, the answer is a typical Microsoftish "this
       ain’t a bug, it’s a feature!".

       More seriously, you’re supposed to move the cursor with the keyboard in
       Liquid  War. There’s no way to handle the cursor "like a mouse pointer"
       (*). This is due to:

       *  Severe limitations in the Liquid War core algorithm.

       *  The fact that moving the cursor "too fast" would really  change  the
          gameplay of Liquid War. As a Liquid War integrist 8-) I can tell you
          the game would really not be the same if you could move  the  cursor
          as  fast  as you wish. It’s part of the game that sometimes it takes
          you ages to recover from a strategical mistakes. You need  to  think
          twice  before  going to the very end of a level. That’s strategy. At
          least that’s how I view things...  Anyways  as  I  mentionned  above
          there’s a limitation in the core algorithm.

       (*)  This  is  not  perfectly true, there’s a way to control the cursor
       with the mouse, but it’s designed for the case "4 people want  to  play
       on   the  same  computer  and  one  single  keyboard  is  not  enough".
       Controlling the cursor with the mouse in Liquid War is possible but yet
       rather  hard  to  master  8-/ Try it and you’ll understand what I mean.
       This mode can be set up in the "Teams" menu.

   Game does not start
       On non UNIX platforms such as Windows or DOS, Liquid War is distributed
       in  a  .zip  file. It’s IMPORTANT that you unzip the .zip files with an
       "unzipper"  which  preserves  the  directory  structure.  Most  install
       problems  under  Windows  come  from  broken  unzipping  programs which
       extract  all  files  in  the  same  directory...  WinZip  8.x  or   the
       unzip32.exe  utility  that comes with DJGPP are both able to uncompress
       Liquid War .zip files correctly.

       On Liquid War 5.5.9 and later, the Windows version should  detect  this
       problem  automatically and warn you with a message which basically says
       something like "Unable to load datafile. Are you  sure  Liquid  War  is
       correctly  installed?".  If you get this message, you need to reinstall
       the game by unzipping it with a "correct" unzipping program which  does
       not wreck directory structrure up.

   Interference with other Windows programs
       It’s  been reported that Liquid War can run very slowly on Windows when
       some other programs (Mozilla for instance) are running.  So  if  Liquid
       War’s  menus seem to be really really slow, then try to shut down other
       applications and run the game again.

       This problem does not seem to apply on GNU/Linux - at least if  you  do
       not run 300 daemons together on your machine 8-)

   Datafile bugs
       Sometimes  there  are  some  problems when compiling the datafile, this

       *  The liquidwarcol,  liquidwarmap  and  liquidwartex  utilities  might
          freeze or segfault. Typing "make" again often solves the problem.

       *  The  background  image  sometimes  ends  up using the wrong palette,
          which has a very nasty consequence: it looks ugly.

       These bugs are quite hard to get rid off, since  I  can  not  reproduce
       them  easily.  The  good  solution  would  be to completely rewrite the
       liquidwarcol, liquidwarmap and liquidwartex utilities.

   Midi does not work on OSS

       IF your midi music on Liquid War, or indeed  any  other  Allegro  game,
       doesn’t  work  and  you  are  using the OSS (Open Sound System) drivers
       (these are the sound  drivers  which  come  with  the  standard  kernel
       distribution),  this  may  well  be  because  Allegro only supports "FM
       synthesis" and not "wavetable" when it is using OSS. FM synthesis is  a
       very  old  method  of  making  sound  from MIDI and has long since been
       replaced by wavetable synthesis, with the net result  that  it’s  quite
       possible  you’ve  got  OSS  MIDI  working  nicely in other applications
       without having FM support set up at all. This is what I found. (It  has
       to  be  said  that  I  didn’t find the FM sound quality quite as bad as
       people have said, though).

       In this situation, it looks to me like you have the following choices:

       Hack Allegro...

       and for the rest of us...

       Use Allegros DIGMID midi driver...

       Get an FM driver up and running...

       *  Find out which FM driver is appropriate for your sound card. If  you
          have  distribution-specific tools and docs for setting up sound, try
          those. If not, you will need to be familiar with  the  knowledge  in
          the  Sound-HOWTO  and  Kernel-HOWTO i.e. know how to compile kernels
          and modules and deal with sound drivers.

       *  Look through the  OSS  modules  in  ’make  menuconfig’  and  see  if
          anything   catches   your   eye.   See  if  there  is  any  specific
          documentation on your sound card on  Do  a
          few web searches. For my AWE64, I use the OPL3 driver.

       *  Compile  and  install the FM driver module, or set up your system to
          use the new kernel if you want to compile the driver in.

       *  Load the module, or boot your new kernel. It is very important  that
          you  pay  attention to what is said in the ’help’ for your FM driver
          in  ’make  menuconfig’  and  read  any  necessary   files   in   the
          Documentation/sound/  directory.  For  example,  I  just  had a nice
          half-hour wondering why the hell my FM wasn’t working  now  when  it
          had  been before - with the OPL3 driver, you have to give the option
          io=0x388 to insmod. Which is stated nice and clear in the docs,  but
          of  course  I  had  forgotten  since  then.  You  can  prevent  such
          happenings by recording options permanently in  /etc/modules.conf  -
          see the manpage etc.

       *  Try the game. If it’s worked you will hear particularly beepy music.

       Opl3 occult FAQ

       --IMPORTANT-- If you are using Liquid War, your FM will  only  work  if
       you  go  to  the  map ’Elephant inside a boa’ and proceed to chase each
       other round in circles for at least 10 minutes. This cures a bug in the
       design of the OPL3 interface which conflicts badly with the core Liquid
       War algorithms. How the hell the music hardware even  knows  about  the
       core algorithms I don’t know, but that’s what I made of the now-defunct
       opl3-occult-FAQ, from which here is an excerpt:

       Many roads a man must take. Those with one-track minds  are  DOOMED,  I
       tells ya.

       ----  The  Liquid  War algorithm calculates distances to one place, the


       Man or machine, face or code, must stand strong  and  solid;  must  not
       just ooze away as slime.

       ----  We think it might just take objection to the whole ’slimy’ nature
       of the LW beings. As well as it being LIQUID War.

       So, our carefully tailored approach, is to  firstly  have  the  players
       going  in all the possible different directions evenly by moving around
       the map in circles, and secondly to divert the  opl3’s  attention  from
       the  general  slimy  liquidness  of it all by emphasizing the solidity,
       reality, and natural goodness of that  classic  tapestry:  an  elephant
       inside a boa.

       That and it’s a f***ing ace level.

   Checksum errors
       The Liquid War server is a "light" servers which - to some extent - has
       no idea about what is going on in the game. It  simply  replicates  key
       strokes  between  clients and each client maintains its own game state.
       Normally, the game is designed so that given the same  user  input,  it
       will behave exactly the same.

       However,  it  happens  that sometimes 2 clients can behave differently,
       and this is a (severe) bug. One consequence is that messages  reporting
       "Checksum  errors"  appear  on the server’s and on the client’s console
       output.  This  bug  appears  when  using  non-default  rules  settings.
       Basically,  if  someones  tweaks  his  rules,  then the checksum errors
       appear. Of course I double-triple checked that options  were  correctly
       sent  on  the network, but, well, could not fix the bug. Yet. The short
       term solution seems to play with default factory settings...

       I’m highly interested in bug-reports concerning this problem.

To do

       In its latest releases Liquid War is quite stable IMHO.  However  there
       are  still  some  issues  with  network under Windows for instance. I’m
       aware of these bugs and I’m trying to fix them  but  this  does  really
       take time.

       I  always welcome bug-reports and patches, as making Liquid War W 5.x.x
       as stable and bug-free as possible is really important to me - and most
       of the time players also appreciate stable programs 8-)

       The  most important bug-fixing area is probably cross-platform support.
       That is, make sure that the game runs fine on every supported  OS.  For
       instance,  it’s  quite  common  for  Mac  OS/X  and/or FreeBSD users to
       "crash" the game. This rarely happens on GNU/Linux, just because it has
       been  so  much more tested on this platform. This applies to Liquid War
       itself and also, to some extent, to Allegro.

   New features
       Let’s be clear:  no  new  features  in  Liquid  War  5.  It’s  bloated,
       complicated,  old,  uninteresting  to  hack. All new features should be
       found in Liquid War 6.

   Liquid War 6
       Since summer 2005, Liquid War 6, a complete rewrite of Liquid  War,  is
       on    its    way.    See   or for more informations.

Work in progress

   Note on releases
       Whenever Liquid War is released,  I  usually  pass  the  good  news  to
       Freshmeat   (  ).  Then  all
       releases  are  accessible  from  the  main  download  page,  which   is

       Releasing  the  game  takes  time,  for  I want all binaries to install
       properly and sources to compile cleanly. Therefore there might be  some
       delay before the time coding is over and the time a release is actually
       ready. So for impatients and/or for people who need  to  test  out  the
       very latest versions (eg someone who wants to compile the game on a new
       platform), it’s possible to access the source repository directly.

   About GNU Arch
       I    use     GNU     Arch     (Tom     Lord’s     Arch     in     fact,  ) instead of the previously used
       CVS. Indeed, tla has some very fancy features such as  signing  patches
       with gpg, and I’m tired of suffering CVS limitations.

       So  FYI  the  previously  active  CVS  repositories, on Sourceforge and
       Savannah, are currently unmaintained.

   How to get latest releases
       *  Step     1:     read      the      excellent      Arch      tutorial
  if  you are
          not familiar with tla. I admit there’s a steep learning  curve,  but
          it’s yet clear and understandable.

       *  Step  2: point on the repository, which is accessible (read-only) on

       A typical set of tla commands would be:

       tla register-archive
       tla get -A liquidwar6--stable

       If you are interested, I can open this repository in  read/write  mode,
       however  one  of  the  points of GNU Arch is that it allows cooperative
       developpement with  multiple  depots,  so  this  isn’t  mandatory.  And
       anyways,  importing  myself  patches received by email has never been a
       real burden.

       Besides,  most  developpement  is  now  done  on  Liquid  War  6.   See                              or for more informations.


       Liquid War is a multiplayer wargame.

       Copyright (C) 1998-2007 Christian Mauduit (

       This program is free software; you can redistribute it and/or modify it
       under  the  terms of the GNU General Public License as published by the
       Free Software Foundation; either version 2 of the License, or (at  your
       option) any later version.

       This  program  is  distributed  in the hope that it will be useful, but
       WITHOUT  ANY  WARRANTY;  without   even   the   implied   warranty   of
       General Public License for more details.

       You should have received a copy of the GNU General Public License along
       with this program; if not, write to the Free Software Foundation, Inc.,
       51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA


       Christian Mauduit <>

                                    v5.6.4                       Liquid War(6)