1Liquid War(6)                    Games Manual                    Liquid War(6)
2
3
4

NAME

6       liquidwar - a unique multiplayer wargame
7

SYNOPSIS

9       liquidwar [-vh]
10

DESCRIPTION

12       Liquid  War is a multiplayer wargame. Its rules are very simple but yet
13       original.
14

OPTIONS

16       -v Displays the version number.
17
18       -h Displays copyright and various information.
19
20       ...
21          There are many other command lines options, which are described fur‐
22          ther in this document.
23

WARNING

25       As Liquid War is a cross-platform program (it also runs on DOS and Win‐
26       dows), I could reasonably not provide groff UNIX-style documentation to
27       Windows  user.  Therefore,  Liquid  War's documentation is available in
28       many formats, including HTML, PostScript and PDF.
29       I believe these formats are easier to read  than  this  man  page.   So
30       check  out the /usr/share/doc/liquidwar or /usr/local/share/doc/liquid‐
31       war directories, for this is where HTML and other  documentation  files
32       should be. Otherwise, if you are a die-hard man page user, you may con‐
33       tinue with this document 8-)
34
35

Rules

37   The Liquid War concept
38       Liquid War is a wargame. But it is different from common wargames.
39
40       When playing Liquid War, one has to eat one's opponent.  There  can  be
41       from  2  to 6 players. There are no weapons, the only thing you have to
42       do is to move a cursor in a 2-D battlefield. This cursor is followed by
43       your  army, which is composed by a great many little fighters. Fighters
44       are represented by small colored squares. All the fighters who have the
45       same  color  belong  to  the same team. One very often controls several
46       thousands fighters at the same time. And when fighters  from  different
47       teams meet, they eat each other, it is as simple as that.
48
49
50   How do teams react?
51       Teams  are composed of little fighters. These fighters all act indepen‐
52       dently, so it can happen that one single fighters does  something  dif‐
53       ferent from what all the other do.
54
55       The main goal of these fighters is to reach the cursor you control. And
56       to do that, they are in a way quite clever, for they choose the  short‐
57       est  way  to  reach  it.  Check  it  if  you want, but it is true, they
58       *really* choose *the* shortest way to reach the  cursor.  That  is  the
59       whole point with Liquid War.
60
61       But  these  fighters are not perfect, so when they choose this shortest
62       way, they do as if they were alone on the battlefield.  That's  to  say
63       that if there is a fighter blocking their way, they won't have the idea
64       to choose another way, which is free from fighters but would have  been
65       longer otherwise. So fighters can be blocked.
66
67
68   Who eats whom?
69       When  two  fighters from different team meet each other, they first try
70       to avoid fighting, and they dodge. But if there is no way for  them  to
71       move,  they  get angry and attack the guy which is blocking them. Some‐
72       times, they attack each other and both loose health. But it can  happen
73       that  a  fighter  is  attacked  by  another  one,  which is himself not
74       attacked at all.
75
76       Here is an example of this behaviour: A blue fighter and a red  fighter
77       both want to move to their right, for that would be the shortest way to
78       reach their cursor if there was nobody on the battlefield. But they are
79       blocked  by other fighters. If, for instance, the red fighter is on the
80       right and the blue fighter on the left, it is  the  red  fighter  which
81       will be eaten.
82
83       When a fighter is attacked, he first looses health, that is to say that
84       he gets darker. When his health reaches 0, his  color  changes  and  he
85       becomes  a  member of the team by which he has been attacked. Therefore
86       the number of fighters on the battlefield always remains the same.
87
88       When fighters of a same team get stuck together and block  each  other,
89       then they regenerate, that is to say that they get brighter.
90
91       However, I think the best way for you to understand the way it works is
92       to try the game...
93
94
95   Basic strategy
96       When I play Liquid War, I always try to surround my opponents,  and  it
97       usually works.
98
99       By  the  way, the computer has no strategy at all, he is a poor player,
100       and if you get beaten by him, it means you have to improve  yourself  a
101       lot!
102
103       But  still,  the  computer  doesn't  do  one thing which I've seen many
104       beginners doing: he never keeps his cursor motionless right in the mid‐
105       dle of his own fighters, for this is the best way to loose.
106
107
108   More strategy
109       Here are some more tips, kindly submitted by Jan Samohyl.
110
111       *  Try  to cut your opponent off walls and surround him completely with
112          your troops; when trying to penetrate his forces  inside  a  tunnel,
113          keep  your  troops at the wall (and force them ocassionaly to attack
114          off the wall). I think this is a biggest weakness  of  the  computer
115          AI, that it doesn't know this.
116
117       *  When  luring your troops to outflank an enemy, always move your cur‐
118          sor through the enemy, not the other way around.
119
120       *  To penetrate very narrow tunnels, stand back for  a  while  and  let
121          some  enemy  troops come from the tunnel to you. Then surround them,
122          destroy, repeat.
123
124       *  I have observed that with more than 2 players (6), the  game  diffi‐
125          culty  depends on the map in the following way: If the playing field
126          is completely empty, without any holes (topologically equivalent  to
127          full  circle),  the  game  is  the  easiest, because you can just go
128          through the middle to outflank your opponent. If there is  a  single
129          large  obstacle  (ie.  playfield is topologically equivalent to ring
130          (the area between two nested circles)), the game is the most  diffi‐
131          cult,  because  you have to choose one direction for the attack, and
132          cannot simply defend the other direction. For other maps,  it  seems
133          to  really  depend  on  their similarity to one of these two extreme
134          situations (and army size, of course, because it changes  the  rela‐
135          tive  size  of obstacles). Also, if you would later add another cur‐
136          sor, this property would probably disappear (maybe then  games  with
137          n+1 obstacles would be the hardest ones with n cursors).
138
139       *  If  you  want a particularly challenging computer game (at least for
140          some maps), use several players, max out attack,  min  out  defense,
141          max out base health (opposite would be harder, but game then changes
142          to the large cloud of black troops, so you don't see  anything)  and
143          give winner an advantage.
144
145
146
147   The winner is...
148       The  clever guy who has got the greatest number of fighters in his team
149       at the end of the game. Or the  one  who  exterminates  all  the  other
150       teams!
151
152

Authors

154   Thom-Thom
155       Liquid War rules have been invented by Thomas Colcombet.
156
157       He  was  trying  to  find algorithms to find the shortest path from one
158       point to another, and found the Liquid War algorithm. Then it  came  to
159       his mind that a game could be build upon this algorithm, and Liquid War
160       was born. He programmed the first two versions of Liquid War using Bor‐
161       land  Pascal  for DOS, and gave me some information about the algorithm
162       so that I could re-program it.
163
164
165   U-Foot
166       I'm the guy who  programmed  the  latest  versions  of  Liquid  War.  I
167       enhanced the algorithms, and did quite a bunch of work to have the game
168       playable by (almost) anyone, that's to say create a correct GUI.
169
170       If you want to join me, here's all the information you'll ever need:
171
172       Christian Mauduit
173
174       E-mail: ufoot@ufoot.org
175       Web site: "https://ufoot.org"
176
177       GnuPG public key: CA272B47  - "https://ufoot.org/gnupg.pub"
178       GnuPG fingerprint: 71AD 4CBB 345A 5F15 6D03  AA6D 1050 9F67 CA27 2B47
179
180       Snail mail: 32 rue Jean Moulin  95100 Argenteuil  FRANCE
181
182
183   Other contributors
184       As Liquid War is now free software, protected by  the  GPL,  anyone  is
185       allowed to view, edit, modify, re-compile the source code, and distrib‐
186       ute it, as long as Liquid War is still distributed under the GPL.
187
188       Here's a list of the contributors:
189
190       *  Alstar: drew a map, which is now included in the main distribution.
191
192       *  Peter Wang: ported Liquid War to GNU/Linux.
193
194       *  Cort Danger Stratton : helped me setting up network support.
195
196       *  Tim Chadburn : wrote midi files for the game. His  contribution  has
197          been  truely appreciated since it's rather hard to find GNU GPL com‐
198          pliant artwork. He also wrote documentation  and  helped  with  midi
199          support in general.
200
201       *  Jan Gretschuskin : contributed 11 maps, and made the German transla‐
202          tion. So if you run Liquid War with German menus, you know  who  you
203          have   to   thank   ->   Jan!  8-)  Also  do  not  forget  to  visit
204          http://www.game-factor.de
205
206       *  Mouse : contributed a map.
207
208       *  Rene Stach : drew 3 maps.
209
210       *  Roderick Schertler : implemented HTTP 1.1 support.
211
212       *  Ryan D. Brown : ported Liquid War to Mac OS X.
213
214       *  Eduard Bloch : maintained the Debian package, and helped with German
215          support.
216
217       *  Michael Terry : provided a .desktop file for better integration with
218          Gnome, KDE and other UNIX desktop environments.
219
220       *  Kasper Hviid : contributed many maps, with their own  textures,  and
221          made   the   Danish  translation.  Great  work,  also  available  on
222          http://levels.2v1.cz/index.html
223
224       *  David Redick : wrote an external random map generator, available  on
225          http://xdavidx.sqrville.org/lwmapgen/index.html
226
227       *  Alexandre Pineau : maintains the Debian package.
228
229       *  Michael Wagner : translated the web site in German.
230
231       *  Peter Williams : fixed the "too many opened socket" server bug.
232
233       *  Jan Samohyl : submitted strategy tips.
234
235       *  Gavin : wrote the Liquid War fanfic.
236
237       *  Dave Vasilevsky : fixed the Mac OS X port.
238
239       *  2 of omega : contributed a map.
240
241       *  666-REFIZUL-666 : created many maps (distributed separately).
242
243       *  Thomas Klausner : fixed Makefile for FreeBSD
244
245       *  Joan Dolc : helped with Mac OS/X port
246
247       *  Jan Szenborn : Polish translation.
248
249
250       Many  other people helped me by submitting bug reports and patches, and
251       I want to thank them for their precious help. Thanks to all the  Debian
252       people too, who nicely maintain the Liquid War .deb package.
253
254

Mailing lists

256   liquidwar-user
257       Description
258
259       This  list  is  for  general discussions about Liquid War. Here you can
260       make suggestions, submit bug  reports,  ask  for  help,  find  players,
261       etc...  Basically,  any  question  or remark which concerns the game is
262       welcomed on this list.
263
264
265       Practical informations
266
267       You can't send messages to the list without subscribing. The only  rea‐
268       son  for  this  is  that  it's  one of the only way to block spam effi‐
269       ciently. I first thought it could be OK to allow anyone  to  post,  but
270       liquidwar-user  seems  to have be harvested by robots, so now I need to
271       restrict posters. However, I insist on the fact that  anyone  can  sub‐
272       scribe,  and  the  subscription to the list is not moderated. So if you
273       are a human being and not a stupid spam robot, you're  welcome  on  the
274       list 8-)
275
276       Here's a list of usefull URLs:
277
278       *  To   (un)subscribe:  http://mail.nongnu.org/mailman/listinfo/liquid
279          war-user
280
281       *  To   consult   archives:    http://mail.nongnu.org/pipermail/liquid
282          war-user/
283
284       *  To post on the list: liquidwar-user@nongnu.org
285
286
287
288
289   Chat and IRC
290       Web-based chat-box
291
292       I  have  have  set  up  a  web-based chat-box which is accessible here:
293       "https://ufoot.org/liquidwar/v5/metaserver.php"
294
295       It's not as good as a good old IRC channel but not  everybody  can  use
296       IRC (because of firewalls and the likes), and I like the idea that peo‐
297       ple can chat and have the list of available servers in one  single  web
298       page.
299
300
301       IRC channels
302
303       I  personnally  spend some time on irc.freenode.net so you might use it
304       to find other players - though I'm not really an IRC  addict...  ...not
305       yet at least!
306
307       Here are the channels I recommend:
308
309       *  #liquidwar  : Liquid War dedicated channel, to find players and chat
310          while playing.
311
312       *  #netgame_players : general channel for  players  who  want  to  play
313          Internet  games  - Free Software and/or Open Source games of course,
314          we're on freenode.net 8-)
315
316
317
318

Fanfic

320   What's this?
321       Quoting Gavin: "I wrote a liquid war fanfic some time ago [...] I wrote
322       it  after  a  friend  claimed  that  there wasn't any liquid war fanfic
323       because it wasn't possible."
324
325       So here it is, a Liquid War  fanfic,  enjoy!  (and  special  thanks  to
326       Gavin)
327
328
329   The Battle of Emberlificoted
330       ...
331
332       The  General presided over his massing army in his seat, or rather hov‐
333       ering ring, of power. It dipped slightly as he flew low over his troops
334       marching  through  the viscous marsh-like terrain. They were like chil‐
335       dren: obedient, loyal, and they ate a lot.
336
337       Glancing at the status panel mounted in front of him he  grimaced;  the
338       other  five  armies:  Yellow, Green, Orange, Turquoise, and, of course,
339       Red, were also readying armies of a similar size to his own. His violet
340       clones would have to fight hard and eat well to win this day.
341
342       Today  would  not be a battle of luck, the General mused, it would be a
343       battle of tactics, of alliances, and of betrayal. Every clone was iden‐
344       tical  -  that  was  the  general  idea behind clones - and the terrain
345       seemed strangely symmetrical; it would not give advantage to any of the
346       six  armies  amassed today. Glancing at the hologram of the battlefield
347       projected in front of him the General noted that he would have to  move
348       quickly,  Orange  and  Yellow were too close for comfort, though fortu‐
349       nately Baron Red's army of eponymous coloured clones was the furthest.
350
351       General Violet's fingertips were sweaty even before  they  touched  the
352       four  main  control  keys  in front of him. They were labeled 'W', 'A',
353       'D', and, of course, the full retreat button - very useful for mislead‐
354       ing  foes  and  ambushing  them  as  they  pursued - 'S'. The keys were
355       arrange in a roughly equilateral triangular pattern; with  'S'  forming
356       the  base and being adjacent to both 'A' and 'D', 'W' formed the tip of
357       the triangle.
358
359       A long breath left his parched lips as at last he made his move.
360
361
362       ...
363
364       "Dammit!" he screamed moments later. He had  misjudged  Captain  Yellow
365       and  Commander  Orange;  he had expected one at least to attack immedi‐
366       ately, one he could have handled. They were working together -  foiling
367       his attempt to shoot between them to near the center of the battlefield
368       to gain a better vantage point. Yellow had shot down towards him,  cut‐
369       ting off his advance, and now Orange had sealed his escape route. "It's
370       not over yet" muttered the General. He opened a voice channel with Com‐
371       mander Orange:
372
373       "Very clever. Flawed, but still clever."
374
375       "Flawed?" came the reply.
376
377       "Yes flawed, when the good Captain is finished devouring my army who do
378       you think he will turn to next?",  bluffed  the  General  -  his  hands
379       worked quickly as he manoeuvred his hovering control ring, all that his
380       troops ever saw of him, carefully towards the weakest  section  of  his
381       attackers.  If  he  could just break out a few units he could soon turn
382       the tide against both Yellow and Orange.
383
384       "We have an alliance..." Orange's voice was unsure now.
385
386       Time for some sarcasm to through her even more off balance, thought the
387       General,
388
389       "I  gathered", he spoke softly, slowly, and with too much meaning. Then
390       closing the channel he turned his attention back to his escape.
391
392
393       ...
394
395       "Yes!" wooped the ecstatic figure of the General. Fifty or  so  of  his
396       troops  had  broken free undetected and were even now working their way
397       cautiously towards the camps of the Yellow army, only the  front  lines
398       were  still actively fighting; this opening gambit of Yellow and Orange
399       had turned into a stale siege and Yellow's army had pitched tent.
400
401       General Violet steered his hovering guidance ring to the center of  the
402       Yellow camp. His troops struck, both those who had got behind the lines
403       and those who were still besieged. Yellow reacted too slowly  and  sud‐
404       denly found that her army, was shrinking back from the onslaught. There
405       was nowhere to run to, and bye now her only ally - Commander  Orange  -
406       had abandoned her to her fate; he was too busy engaging Sir. Turquoise,
407       who had managed to escape from the slaughter that the Baron had  caused
408       to  the Turquoise ranks and was even now valiantly attacking the flanks
409       of the Orange troops.
410
411       A glance at the status panel showed that Yellow's life force was fading
412       quickly: 8%, 3%, 1%, Gone.
413
414       The  General  smiled,  he always enjoyed getting the first kill, and by
415       now his armies life force had grown and his clones had replicated. With
416       his,  now,  formidable  fighting force it was no problem to engulf both
417       Sir. Turquoise and Commander Orange's brawling  armies  and  annihilate
418       them. Once again his army grew in size and power. Now if only the Baron
419       didn't notice that..., thought the General.
420
421
422       ...
423
424       "Too late!" yelped the General, now thrown into panic, as  he  saw  the
425       approaching  Baron.  His army had also grown in size and power - having
426       fatally injured the Turquoise army within the opening  moments  of  the
427       battle,  and  having  finally managed to catch the elusive fleeing form
428       of, or what remained of, Emperor Green.
429
430       Gripping the controls harder the  General  thought  quickly,  his  army
431       doesn't  so  completely outnumber me that this is already over, however
432       unless I can cause him to make a mistake that allows  me  to  take  the
433       upper hand then I will inevitably lose. Maybe I can...
434
435       This  thought  was  terminated  and  replaced by another as the Baron's
436       angry red troops broke through the undergrowth that had  covered  their
437       movements  and started to surround the General's army. The thought that
438       now throbbed through the panic-stricken mind of General Violet was sim‐
439       ply 'Run!'.
440
441       Even as he signaled the retreat and made for what seemed to be the only
442       possible means of escape the Baron's blood red control ring appeared at
443       the  opening. The General knew it was over, even before the host of red
444       beings appeared at the opening.
445
446       There was no escape. His life force was almost depleted and he was sur‐
447       rounded. Then it was that the Baron decided to communicate:
448
449       "Too bad. It was a good game"
450
451       The  General  blinked, gaped, and was generally gobsmacked. Just before
452       his life force completely failed and  his  own  weary  eyes  closed  in
453       defeat he snarled,
454
455       "What!? This is not a game!" were the General's dying words.
456
457
458
460   Introduction
461       This  section  describes  how the GUI works. Since programming advanced
462       GUIs with Allegro is not so easy - standard  C  programming  definitely
463       lacks flexibility -, and also since it's somewhat hard for me to figure
464       out what is user-friendly and what's not, Liquid War's  menus  are  not
465       always  self-explanatory.  I'll  just  try and do something better next
466       time!
467
468
469   Menus
470       Map menu
471
472       The map menu allows you to choose the map you are going to play  on.  A
473       map is defined by 3 things:
474
475       *  A  frame. The frame can be chosen with the slider which is below the
476          preview. The frames are automatically sorted by alphabetical order.
477
478       *  A texture for walls.
479
480       *  A texture for the zone where fighters are allowed to move.
481
482
483       In the middle of the screen, there is a preview of the level.  In  this
484       menu, the values of the parameters can be independently changed by:
485
486       *  Moving a slider.
487
488       *  Clicking on a "+" or a "-" button.
489
490       *  Typing a number.
491
492
493       On  each  side of the preview, sliders allow you to choose the two tex‐
494       tures. There is also a preview of  each  texture.  Below  this  preview
495       there  are  128 little buttons which allow you to choose single colored
496       textures.
497
498       The name of the map and its resolution are displayed in the lower  part
499       of the screen.
500
501       You'll notice that on some maps the texture selection zones simply dis‐
502       appear. This is because these maps are associated with  a  texture,  so
503       choosing a different texture is often not recommended for it won't look
504       as nice as with the right one. If you still want to override  this  be‐
505       haviour  you  can  click  on the "on/off" button just right to the "Use
506       default texture" label. This is a toggle button which will allow you to
507       use  your  own  textures even on maps that normally come with their own
508       skin.
509
510       You'll also notice that a "Random map" button is available. This button
511       generates  a  new  random  map  using  an external program, "lwmapgen",
512       developped  by   David   Redick,   available   on   http://www.cs.clem
513       son.edu/~dredick/lwmapgen/
514
515       This program supports many command line options, and if you want a very
516       precise control on the generated maps, you'll  need  to  run  it  sepa‐
517       rately. Looking at LW's log file you should be able to see the commands
518       LW issues when calling this program, this can give you ideas on how  to
519       launch  it  manually.  Alternatively  using  the  "--help"  option (for
520       instance "liquidwar-mapgen --help" under UNIX) should describe  how  to
521       use it.
522
523
524       Teams menu
525
526       This menu allows you to choose the teams which are going to play. There
527       are 6 square zones in this menu. Each of them is associated to a team.
528
529       Each team can be either:
530
531       *  Disabled ("Off")
532
533       *  Controlled by a player ("Human")
534
535       *  Controlled by the computer ("Cpu")
536
537
538       The computer plays poorly, so remember that Liquid War is  basically  a
539       multiplayer  game,  and  that the cpu control is dedicated to beginners
540       only.
541
542       You can also choose the color associated to each team  by  clicking  on
543       one of the 12 colored buttons.
544
545       Below the 12 colored buttons, there are four buttons which allow you to
546       choose your keys. Click on one of these buttons and then press the  key
547       you  want  to  define. Joystick movements and buttons are considered as
548       keys. You can disable the joystick with the button which is at the bot‐
549       tom left of the menu. Mouse input is also possible, and mouse movements
550       are considered as keys too. To define mouse control, click on the  but‐
551       ton  associated to the direction you want to control, and then move the
552       mouse. Then the button should display something like "M->". Mouse  sen‐
553       sibility  can  be set with the little slider at the bottom right of the
554       menu.
555
556
557       Graphics menu
558
559       Here you can choose the graphic options of the game.
560
561       The "Video mode" button allows you to  switch  between  fullscreen  and
562       windowed mode. This button is not available under DOS.
563
564       The "Brightness" slider allows you to set the brightness of the game.
565
566       The  "Menu  res"  slider  allows  you to set the resolution used by the
567       menus. There are currently 5 possible values,  which  depend  on  which
568       platform you're running the game on.
569
570       I personnaly think the menus look best with the 640x480 resolution, but
571       some may prefer higher resolutions. Lower resolutions  should  only  be
572       used if you have problems using SVGA video modes.
573
574       The  "Game res" slider allows you to set the resolution used during the
575       game. The allowed values are the same than those for the menus. I  rec‐
576       ommend  that  you  don't use resolution higher than 640x480, unless you
577       have a Pentium VIII running a 10GHz.
578
579       Page flipping can be toggled. It is up to you to decide wether you keep
580       this  option  or not. The main disavantage of turning page flipping off
581       is that the info bar and the battlefield can look rahter ugly  if  they
582       overlap. But if you turn page flipping on you will not easily reach the
583       166 frames per second I sometimes get on small levels with my K6-225. I
584       personnaly always turn page flipping off.
585
586       The  viewport  size defines how much of your screen will be used by the
587       battlefield.
588
589       *  If you set the slider on its left position, the batllefield will not
590          be  stectched at all. Or if is strechted, it will be by a x2 or a x4
591          factor. So this is the mode wich allows the fastest display.
592
593       *  If you set the slider ont its right position, the game will  run  in
594          fullscreen mode.
595
596       *  With  all  the  other  positions of the slider, the battlefield will
597          keep its general proportions but it will be stretched.
598
599
600       The "Waves" button allows you to toggle the wave effect. You  can  also
601       do this while playing, by simply pressing F4.
602
603
604       Sound menu
605
606       This  section allows you to set the sound volumes. There are 4 sliders,
607       which are:
608
609       *  "Sfx": sets the volume of all  the  sfx  sounds,  thats  to  say'the
610          sounds you hear when the game starts, when you loose etc...
611
612       *  "Click":  sets  the  volume  of the click, this nasty noise you hear
613          each time your press on a button.
614
615       *  "Game water": sets the volume of the blop blop blop sounds which are
616          played continuously while you are playing.
617
618       *  "Menu  water":  the same thing than "Game water" except that it con‐
619          cerns the sounds played while your are choosing options.
620
621       *  "Music": general music volume.
622
623
624
625       Rules menu
626
627       This menu is the one where you can change the rules of the game.
628
629       The "Time" slider controls the time limit. The  game  will  stop  after
630       this time is elapsed. You can pause the game by pressing the "F3" key.
631
632       By  the  way, an info bar can display the time left while you are play‐
633       ing. This info bar can be toggled during the game by pressing the  "F1"
634       key,  and you can change its location by pressing the "F2" key. It also
635       displays how many fighters there are in each team.
636
637       The "Army size" slider controls the amount of fighters there will be on
638       the  battlefield.  The  position  of  the slider reflects the amount of
639       fighters of all the teams together. If there are  4  teams,  then  each
640       player  will  have  half as many fighters than if there had only been 2
641       teams.
642
643       The "Cursor x" slider controls the speed of your cursor.
644
645       *  If it is set on the left, the cursor goes at the same speed than the
646          fighters.
647
648       *  If it is centered, the cursor goes twice faster than the fighters.
649
650       *  If  it is set on the right, the speed of the cursor is multiplicated
651          by 3.
652
653
654       Below is a "Min 160x100" box with a slider on  its  right.  This  means
655       that  maps  will automatically be magnified so that they have a size of
656       at least 160x100. Indeed, some of the maps that come  with  Liquid  War
657       were  designed  in 1995 when 486 Intel computers were common. Therefore
658       the maps were smalls. Today, these maps are not really fun to  play  on
659       fast  computers,  so  Thomas  Harte suggested this automatic magnifying
660       feature, and that was IMHO a smart idea. You can move the slider to the
661       right to make maps use a higher resolution - ie magnify them.
662
663       The  "Defaults"  button  of  the "Rules" menu will reset rules to their
664       defaults. This way you can tweak  rules  and  then  come  back  to  the
665       default  rules  whenever  you want. Note that there's also a "Defaults"
666       button in the main "Options" menu, but it  will  reset  *all*  options,
667       including player names... The advantage of the "Defaults" button in the
668       "Rules" menu is that it will only reset rules parameters, and keep  the
669       rest of your configuration options untouched.
670
671
672       Speeds menu
673
674       The "frames/s" slider allows you to limit the number of frames per sec‐
675       ond. If this slider is set on the left, there won't be  any  limit,  so
676       Liquid  War  will  repaint your screen each time the fighters move. But
677       this can be a weird behaviour if your machine is really  fast,  for  no
678       one  cares  about  100  fps per second, one can not even see them... So
679       this paramters limits the refreshment rate, so that there can  be  sev‐
680       eral  logical  moves of the fichters for only one screen refreshing. If
681       it is set on its right, the display is limite to 10 fps, so you'll have
682       to find your setting. I personnally set it right in the middle, and get
683       40 fps. If you press "F5", you'll get the number of frames per  second,
684       and  if you press "F6", you'll get the number of logical moves per sec‐
685       ond. You can also press "F7" or "F8", and you will get  the  percentage
686       of time your computer spends on calculating or displaying the level.
687
688       The "rounds/s" slider allows you to limit the number of rounds per sec‐
689       ond. If this slider is set on the left, there won't be  any  limit,  so
690       Liquid War will run as fast as possible. This setting will be of no use
691       if you use Liquid War on a slow computer or  if  you  play  with  hudge
692       maps,  but sometimes, with a high-end Pentium class computer, it's sim‐
693       ply impossible to play on small maps because things simply go too fast.
694       So  this  parameter  is here to help you and avoid the "10000 moves per
695       sec" problem.
696
697
698       Waves menu
699
700       This is where the wave parameters are set. The waves are just a graphic
701       effect,  which  is  not  really usefull. I don't often use waves, but I
702       still think they can sometimes look nice. Change  these  parameters  if
703       you  really  mean to do it, but if you don't understand what they mean,
704       it is really OK...
705
706       There are 4 different types of waves, each of them being defined by:
707
708       *  An "Ampli" parameter, to define how big the waves have to be.
709
710       *  A "Number" parameter, to define how many waves should  be  displayed
711          at the same time.
712
713       *  A "Speed" parameter, to define how fast the waves should move.
714
715
716       If  you  want  to  undestand  what the "WX", "HY", "WY", and "HX" codes
717       mean, try to pay with only one type of wave, the "Ampli"  parameter  of
718       the  3 other types of wave being set to 0 (that is to say the slider is
719       on its left position), and sea how it looks like.
720
721       The wave effects can be toggled during the game by  pressing  the  "F4"
722       key.
723
724
725       Advanced menu
726
727       This menu allows the user to change the behaviour of the fighters.
728
729       The  "Attack" slider sets the agressivity of the fighters. If it is set
730       on the right, fighters eat each other very fast. If it is  set  on  the
731       left, it takes ages to fighters to change teams.
732
733       The "Defense" slider sets the capacity that the fighters have to regen‐
734       erate themselves. The more it is on  the  right,  the  faster  fighters
735       regenerate.
736
737       The "New health" slider sets the health of the fighters which have just
738       changed teams. The more it is on the left, the  weaker  these  fighters
739       will be.
740
741       The  "Winner help" slider controls a parameter which causes fighters to
742       attack with various strength depending on how many fighters  belong  to
743       their team. Not very clear... Let's just say that:
744
745       *  If  this  slider  is set on the right, the more fighters you have in
746          your team, the more aggressive they will become.
747
748       *  If it is centered, all the fighters of every team will always attack
749          with the same strength.
750
751       *  If  it  is set on the left, the less fighters you have, the stronger
752          they will be. In this mode, games usually never end.
753
754
755       The "Cpu strength" parameter never makes the computer more  intelligent
756       than  a  monkey.  But  if  you  set  it on the right, it advantages the
757       machine outrageously and fighters controlled by the cpu will be  really
758       strong.  So  to  get  rid  of them you'll definitely need to be clever.
759       Again and again, don't forget that Liquid War was conceived as a multi‐
760       player  game  and  that  playing  against the computer is not really an
761       interesting thing to do.
762
763       The "CPU vs human" parameter allows you to control how aggressive  CPUs
764       are towards humans.
765
766       *  If  set  to  "Always", CPUs will always attack humans and will never
767          try to attack another CPU, unless there are  no  humans  left.  This
768          used to be the default behavior in previous Liquid War versions, but
769          some players remarked that it was rather unfair, so now this  is  an
770          option.
771
772       *  If  set to "Random", CPUs won't care wether their opponents are CPUs
773          or humans, they'll attack anybody. This is the default behavior.
774
775       *  It set to "Never", CPUs will  attack  each  other  before  bothering
776          human players.
777
778
779       The  "Allow  net  bots"  button can be used to allow bots to connect on
780       network games. Indeed, bots are by default disabled in  network  games,
781       since  in this case LW assumes that bots are useless (there are already
782       several human players). However, turning this option on will allow  you
783       to  connect bots within the game. It's important to note that this is a
784       per client option, this means that you can't use it to forbid access to
785       bots  to  a given network game. This option was simply created to avoid
786       confusion when connecting on network games, while still  allowing  bots
787       to connects if you really want them to.
788
789       The "Algorithm" parameter allows you to force the algorithm to standard
790       C mode. There's no real good reason you would like to  do  this,  since
791       the C algorithm is slower than the ASM one. Moreover, the ASM algorithm
792       is automatically disabled if you play against a computer which does not
793       have ASM enabled. Think of this as a testing/debugging option.
794
795
796
797   Hot keys
798       Here's a list of keys you might use while playing:
799
800       *  F1:  toggles  the  "info"  zone where the game time and the state of
801          each team is displayed.
802
803       *  F2: moves the "info" the zone arround, possible positions being top,
804          right, bottom and left.
805
806       *  F3: pauses the game. This function is disabled during network games.
807
808       *  F4:  toggles the "wave effect". Without this "wave effect", which is
809          turned on ny default,the game will run faster.
810
811       *  F5: displays the number of frames per second (*).
812
813       *  F6: displays the number of rounds per second (*).
814
815       *  F7: displays the precentage of CPU spent on the game  logic,  calcu‐
816          lating where fighters must go for instance (*).
817
818       *  F8: displays the precentage of CPU spent on graphics (*).
819
820       *  F9:  turns  on/off  the "capture" mode. In this mode, screenshots of
821          each frame are taken, and written to the hard drive as bitmaps.
822
823       *  F10: quits the game right away without any confirmation prompt, also
824          known as the "my boss is coming here!" function.
825
826
827       (*)  all  these  figures tend to be clearly false as computer go faster
828       and faster. Basically, the time  required  for  "logic"  and  "display"
829       operations  is getting shorter and shorter, and the tools I use to mea‐
830       sure it are not precise enough. Therefore I  get  approximations  which
831       might by plainly wrong.
832
833

Network game

835   Basics
836       Since release 5.4.0, Liquid War includes network support, that's to say
837       that people can play over a LAN (Local Area Network). However,  due  to
838       limitations  in  Liquid War's legacy code, and also because of the lack
839       of time I have, it might be a little tricky to set up a network game at
840       first. So please read this section carefully.
841
842       You should keep in mind that:
843
844       *  DOS only releases of Liquid War do not include network support, only
845          Windows and GNU/Linux versions will allow you to set  up  a  network
846          game.
847
848       *  The  game  should  run  fine on any LAN, but there's no garantee the
849          game will be playable on the Internet. Indeed if your  "ping  delay"
850          is  not good enough, the game will be awfully slow. Bandwidth is not
851          an issue, since Liquid War rarely needs more than 2 Kb/sec.
852
853       *  You'll need to know what an IP address is.
854
855       *  You don't need to set up a network game to run a  multiplayer  game.
856          Liquid  War  was  originally a multiplayer game without network sup‐
857          port. Network support is here only for people who  don't  feel  com‐
858          fortable when playing at 6 on the same keyboard 8-)
859
860
861
862   Getting started
863       What do you need?
864
865       You'll basically need 2 computers connected on the same LAN. We'll call
866       them computer A and B. You might be able to play over the Internet too,
867       but the game can be harder to set up and - which is worse - very slow.
868
869       You'll  also need to know the IP address of computer A. Type "ipconfig"
870       under Windows or "ifconfig" as root under GNU/Linux to get this  infor‐
871       mation if you don't have it.
872
873
874       Starting the server
875
876       Liquid  War uses a very traditionnal client/server approach. Basically,
877       the server gets informations from all the clients and  then  dispatches
878       the collected information to everybody.
879
880       So  you'll  need  to  start  a server on computer A by running "liquid‐
881       war-server" on GNU/Linux or "lwwinsrv.exe" on windows. This is  a  con‐
882       sole application, ie it does not set up any graphic mode.
883
884       Here's a small example of a server start on GNU/Linux:
885
886       $ liquidwar-server
887       How many teams will connect to this server?
888
889       At  this  point you must enter a number between 2 and 6, and then press
890       "ENTER". In this example we will answer 2. The server really  needs  to
891       know  how  many  teams  will be in the game: when enough teams are con‐
892       nected, the game starts. It can also be a good idea to answer 6 system‐
893       atically  and  then force game start by clicking the "Start now" button
894       within the client. It's possible to skip this question by typing  "liq‐
895       uidwar-server -2" instead of a plain "liquidwar-server".
896
897       Use "-2" to get rid of this question.
898       Register on "www.ufoot.org/metaserver/" (y/n)?
899
900       Now  if  we  answer "y", then the server will automatically contact the
901       "meta-server" and  it  will  be  listed  on  "https://ufoot.org/liquid
902       war/v5/metaserver.php"
903
904       This can be convenient for people who want to find other gamers to play
905       with on the Net. For now, let's answer "n", we'll test this meta-server
906       stuff later 8-)
907
908       Use "-private" to get rid of this question.
909       2002-06-03 16:43:00: Listening on port 8035...
910       2002-06-03 16:43:00: Waiting for 2 teams...
911
912       Now  the  server  is  ready to accept clients. By default it listens to
913       clients on port 8035. You could change this behavior setting by calling
914       "liquidwar-server  -port  8061" for instance, but let's use the default
915       port to make things easier.
916
917
918       Starting the clients
919
920       Start the client on  computer  A  normally  by  typing  "liquidwar"  on
921       GNU/Linux or double-click "lwwin.exe" on Windows.
922
923       Go  to  the "Teams" menu and select 2 teams, a red human and a blue CPU
924       for instance. If you don't know how to do this, then try and play  Liq‐
925       uid  War  on  a single computer first. It's important to notice that by
926       default the "blue CPU" won't connect on the network game. It's possible
927       to  allow  bots  to  connect on network games, but they are disabled by
928       default.
929
930       Now come back to the main menu, and  a  "Net  Game"  button  should  be
931       available. Click it. Now you should be able to:
932
933       *  Start the game.
934
935       *  Change the IP address of the server.
936
937       *  Change the communication port.
938
939       *  Set a password.
940
941       *  Search for internet games automatically.
942
943
944       Since the server is also running on the same machine (A), you can leave
945       the default IP address as is (127.0.0.1).
946
947       Now you are ready to start the second client on computer B.  Like  with
948       computer A, you'll have to:
949
950       *  Select 2 teams, green an yellow this time.
951
952       *  Select "Net Game" in the main menu.
953
954
955       But  this time you'll also need to change the server address, since the
956       client is not running on the same computer than the server.
957
958       Now click on "Start game" on computer A. The server should play a "sys‐
959       tem beep", which is usefull if you run a server and want to be notified
960       of client connections without watching the console all the time, and it
961       should display messages like this:
962
963       2002-06-03 16:44:48: Connection from "127.0.0.1:34677"
964       2002-06-03   16:44:48:  Team  "Napoleon"  on  client  "127.0.0.1:34677"
965       accepted
966       2002-06-03 16:44:49: Client "127.0.0.1:34677" accepted
967       2002-06-03 16:44:49: Waiting for 1 team...
968
969       And on the client you should see a screen which  says  "Waiting  for  1
970       team(s)"  with  the  list of connected players below (Napoleon). You do
971       not need to click on the "Start now" button.
972
973       Now click on "Start game" on computer B. The server should display mes‐
974       sages like this:
975
976       2002-06-03 16:49:14: Connection from "192.168.1.1:1098"
977       2002-06-03  16:49:14:  Team  "Henri  IV"  on  client "192.168.1.1:1098"
978       accepted
979       2002-06-03 16:49:15: Client "192.168.1.1:1098" accepted
980       2002-06-03 16:49:15: Client "192.168.1.1:1098" ready
981       2002-06-03 16:49:15: Client "127.0.0.1:34677" ready
982       2002-06-03 16:49:15: Sending info to "127.0.0.1:34677"
983       2002-06-03 16:49:15: Sending info to "192.168.1.1:1098"
984       2002-06-03 16:49:16: Game start
985
986       And at that point, the game should start 8-)
987
988
989       Restart a new game
990
991       Once the game is over, you  can  start  another  network  game  on  the
992       clients  without  touching the server, because the server automatically
993       restarts and waits for players to connect.
994
995       To stop the server - if you want to change its settings for instance  -
996       just go to the console where it's running and press CTRL-C.
997
998
999       Using Docker
1000
1001       Docker (see http://docs.docker.com/ for details) is a convenient way to
1002       launch a server without re-inventing (rather, re-compiling) the wheel.
1003
1004       You might want to run the server this way if, for instance, you need to
1005       have  it run on a remote box where you do not wish to install a complex
1006       Liquid War stack, Allegro and the rest.
1007
1008       Please visit "https://hub.docker.com/r/ufoot/liquidwar-server/"  for  a
1009       list  of  available  images,  once  it's  installed, running the server
1010       should amount to something like:
1011
1012       docker pull ufoot/liquidwar-server
1013       docker run -p 8035:8035 ufoot/liquidwar-server
1014
1015       Additionnally, images are provided to  run  the  metaserver,  which  is
1016       responsible  for  registering  and  listing  all  running  games. While
1017       there's no real reason to run your own since one should permanently  be
1018       available on ufoot.org, it's quite straightforward to run your own:
1019
1020       docker pull ufoot/liquidwar-metaserver
1021       docker run -p 8053:8053 ufoot/liquidwar-metaserver
1022
1023
1024
1025   Using the meta-server
1026       Basics
1027
1028       The meta-server is a piece of software which is running on my web site,
1029       and allows servers to register themselves so that client can get a list
1030       of available servers.
1031
1032       It's  written  in PHP and is _very_ basic but I believe it's enough for
1033       what has to be done: maintain a list of running servers.
1034
1035       The source code for the meta-server is included in the  source  package
1036       of  Liquid War, so you might run such a server yourself if you want to.
1037       However, by default, servers will register themselves on my  web  site,
1038       and will be listed on "https://ufoot.org/liquidwar/v5/metaserver.php"
1039
1040
1041       How to register a server
1042
1043       Launch the server, and when you get the question:
1044
1045       Register on "www.ufoot.org/metaserver/" (y/n)?
1046
1047       answer "y".
1048
1049       Note  that  if you're behind a proxy or a firewall, the server might be
1050       unable to register itself. Clients might also have problems to  connect
1051       themselves  on your server if there's a machine which does NAT (Network
1052       Address Translation) between you and the meta-server.
1053
1054
1055       How to find a server
1056
1057       In the main menu, click on "Net Game" and  then  "Search  for  internet
1058       games".
1059
1060       Now  you  should  see a list of available servers. You can click on the
1061       items in the list to get more informations about a given  server.  Once
1062       you have chosen a server, click on "Join now".
1063
1064       Now you get on a "Waiting for teams" screen. You might be interested in
1065       using the "Start now" button. Indeed, if you are 4 players connected on
1066       a  server  that accepts up to 6 players, maybe you'll want to start the
1067       game right away without waiting for 2 more players. In this case, every
1068       player  must click "Start now". A "*" character will replace the "-" in
1069       the players list when a player clicks on  "Start  now".  When  all  the
1070       players are displayed with a "*a, the game starts.
1071
1072       You can also chat with other players by entering text in the area above
1073       the "Send message" button, and then click on this button. Keep in  mind
1074       that  this is a very primitive chat and that the best way to chat effi‐
1075       ciently is IMHO to play in windowed mode and  have  an  IRC  client  at
1076       hand.
1077
1078       Note  that  you  can  also  get  the  list  of  available  servers from
1079       "https://ufoot.org/liquidwar/v5/metaserver.php" There you'll also  find
1080       a  little  chat-box which will allow you to send exchange messages with
1081       other players.
1082
1083
1084
1085   Options
1086       Server options
1087
1088       You can pass options to the server using the command line. The  follow‐
1089       ing parameters are accepted:
1090
1091       *  "-n"  where  "n"  is a number between 2 and 6 : with this option you
1092          can tell the server how many teams will connect to the game. Beware,
1093          there  can  be several teams on the same computer, so if you want to
1094          have a computer with 2 players on it and 2 other  computers  with  a
1095          single player, then you need to use the "-4" option.
1096
1097       *  "-lag n" where "n" is an integer : with this option, you can control
1098          the lag used at startup. Normally, Liquid War handles this parameter
1099          automatically, but you might want to force it to a given value.
1100
1101       *  "-port n" where "n" is an integer : allows you to change the IP port
1102          used by the server to listen to the clients. if you omit this param‐
1103          eter, the default port is (8035) is used.
1104
1105       *  "-log  file.log"  :  dumps all informations in "file.log" instead of
1106          using the standard output.
1107
1108       *  "-public" : skips the "Register on ..." question, and registers  the
1109          server automatically on the meta-server, so that clients can find it
1110          easily.
1111
1112       *  "-private" : skips the "Register on ..." question, and does not reg‐
1113          ister the server at all.
1114
1115       *  "-comment  This_is_a_comment"  : associates a comment to the server,
1116          which will be displayed by the meta-server. Note that the  character
1117          "_" will be replaced by spaces. This makes command line parsing eas‐
1118          ier. I'm lazy 8-)
1119
1120       *  "-password xxx" : associates a password to  the  server.  With  this
1121          option,  clients  will need to give the right password to be able to
1122          connect on the server.
1123
1124       *  "-callback cmd" : with  this  option,  the  command  "cmd"  will  be
1125          launched whenever someone connects on an empty server. For instance,
1126          if you want to run a permanent server and want to know when  someone
1127          connects  but do not wish to permanently keep an eye on the server's
1128          log, you might use this option and put in "cmd" a command that auto‐
1129          matically  sends you a mail. You might also use a command that fires
1130          a popup window. It's up to you. 2 sample scripts  are  available  in
1131          the  "misc"  directory of the Liquid War source distribution. One is
1132          "misc/liquidwar_notify.sh" and works  on  UNIX  platforms,  and  the
1133          other  one  is  "misc/lwpopup.js",  which  is  automatically used by
1134          "misc/lwserver.bat", and works on Windows.
1135
1136
1137
1138       Common options
1139
1140       These options work on both client and server, even if they  are  rather
1141       "server-oriented".
1142
1143       *  "-metaserver url" : redefines the URL of the meta-server. Usefull if
1144          you want to use your own meta-server.
1145
1146       *  "-netlog" : if you use this option, the server  will  dump  all  the
1147          network  traffic  on the standard output. This is usefull for debug‐
1148          ging.
1149
1150       *  "-nobeep" : Disables the system beeps  that  the  application  might
1151          fire.  These  beeps  are mostly used on the server to notify clients
1152          connections.
1153
1154
1155
1156
1157   About Liquid War's network implementation
1158       Basics
1159
1160       Liquid War uses TCP sockets, and a single-threaded server. This implies
1161       that:
1162
1163       *  The game can sometimes get blocked if you play on Internet.
1164
1165       *  The server can't talk simultaneously with several clients.
1166
1167
1168       I needed to use TCP sockets, since LW's algorithm can not cope with any
1169       data loss and it's not a reasonnable to try and anticipate what the map
1170       would be like if the player did not move etc...
1171
1172       I  did not implement any complex multithreaded stuff since I'm lazy and
1173       however, clients need to have informations about all the  other  before
1174       something  can  be  done. However, implementing a mutltithreaded server
1175       could have advantages over the current solution.
1176
1177
1178       What is this lag stuff anyway?
1179
1180       In Liquid War, all the clients send their key presses  to  the  server,
1181       and  then  the server dispatches this information to everyone. This has
1182       to be done for every round.
1183
1184       You can easily imagine that if a player has a poor connection,  with  a
1185       very  long  "ping  delay",  it  can  take quite a long time to send the
1186       information to the server, and then get it back.
1187
1188       So what Liquid War does is that at  the  beginning  of  the  game,  the
1189       server  sends a couple of "blank" key strokes to the clients. This way,
1190       clients receive data from the server before thay  have  sent  any.  The
1191       number  of  key strokes sent at the beginning of the game is called the
1192       "lag".
1193
1194       So if it takes 200 msec to send and then receive data from  the  server
1195       (approx  the time returned by the "ping" command) then with a lag of 6,
1196       you can theorically play at a rate of (1/0.2)*6=30 rounds/sec.
1197
1198       On one hand, setting the lag parameter to a high value will avoid  many
1199       network  errors  and allow you to play at a very fast pace, but the big
1200       drawback is that there will be quite a long time  between  the  instant
1201       you  send  a  key  stroke to the server and the moment it comes back to
1202       you. On the other hand, setting the lag to a low value will limit dras‐
1203       tically he number of rounds per second, but make the game more "respon‐
1204       sive".
1205
1206       However, since release 5.4.1, the "lag" is modified  automatically  and
1207       should  adapt itself to the situation. I've not been able to test it in
1208       real conditions yet, but it should work 8-)
1209
1210       Still, setting the lag to a sensible default value can  save  you  some
1211       trouble. Indeed, by default, Liquid War will choose a value (6), but it
1212       can not guess if you are playing on Internet or on a 100 Mbit LAN,  and
1213       it can take quite a long time before Liquid War automatically finds the
1214       right value. To know the right value which  should  be  used  with  the
1215       "-lag" option, simply play a few games and watch the average lag (which
1216       is displayed on the server console every minute)  at  the  end  of  the
1217       game.
1218
1219
1220       Performance issues
1221
1222       Liquid  War  uses  a  "light" server, and one of the advantages of this
1223       solution is that it allows you to run the server on low-end  computers.
1224       I  personnally  run a permanent server on a 486 DX2, and it runs like a
1225       charm.
1226
1227       The only thing you have to take care of when running a server is  band‐
1228       width. Don't worry, you won't need a 10Mbit connection, basically, each
1229       clients sends and receives 12 bytes of data at each round. If  you  add
1230       TCP/IP  headers  and  the  facts that stuff will probably be bundled in
1231       bigger packets, a client must deliver about 15 Kbit/sec (up  and  down)
1232       for  a  game that runs at 100 frames/sec. A 56K V90 modem is enough for
1233       this.
1234
1235       So if you run a server with 2 clients connected, the server  will  need
1236       to deliver 30 Kbit/sec in both ways. A 56K V90 modem _can_ do that, but
1237       your provider needs to be a good one 8-)
1238
1239       And if you run a server with 6 clients, you simply  won't  be  able  to
1240       reach  the 100 frames/sec with a 56K V90 modem. It will necessarly drop
1241       to something less than 30 frames/sec, and is likely to drop to about 15
1242       frames/sec.  OK this is not a big deal, since few Internet games run at
1243       more than 30 frames/sec, but well, if the server has  troubles  receiv‐
1244       ing/sending data, everyone will wait, and the fun will go away.
1245
1246       As  a conclusion: if you have the choice, choose the friend who has the
1247       best bandwidth to run the server, without even considering the power of
1248       his computer.
1249
1250
1251
1252   Troubleshooting
1253       General information
1254
1255       Network  support  in 5.4 and 5.5 is still experimental in many ways, so
1256       you might get weird behaviors. Basically, if you have a  problem,  just
1257       do the following:
1258
1259       *  Stop  and  restart the server when something goes wrong. To stop it,
1260          use CTRL-C.
1261
1262       *  Check out that you have entered the correct IP addresses.
1263
1264       *  Try and start the client and the server using the  "-netlog"  option
1265          to have an idea about what's happening.
1266
1267
1268
1269       Bugs in 5.4.x corrected in 5.4.2
1270
1271       Liquid  War  5.4.0  and 5.4.1 were very hard to play over the Internet.
1272       The reason is that the network routines did not do enough error  check‐
1273       ing,  and  therefore  there  were very often errors when sending and/or
1274       receiving the map to the server. Hopefully, this bug should not  appear
1275       anymore in 5.4.2 or any other recent release.
1276
1277
1278
1279   About security
1280       Network games passwords
1281
1282       As  you might have noticed, under the box where you can enter the pass‐
1283       word, a little notice explains that you must choose a "weak"  password.
1284       Now  you'll tell me -> people keep on explaining me that passwords must
1285       be something complex like "aS\r!Y9p" and now I'm told to  use  "hello",
1286       what's up?
1287
1288       OK,  keep  in  mind Liquid War is a game. This password stuff is just a
1289       way to be able to play with your friends only and  keep  on  using  the
1290       meta-server's  services. Liquid War does not encrypt data and I can see
1291       no good reason to do it for, so the password is stored and sent to  the
1292       server in clear, as plain text.
1293
1294       The  consequence  is that if you use a valuable password - for instance
1295       the one you use to log in on your computer  -  the  guy  who  runs  the
1296       server  will  see your password in the log file if he wishes to. There‐
1297       fore, use something weak, something that if someones finds out what  it
1298       is, you won't really care. So "hello" is a wise choice.
1299
1300
1301       Is Liquid War likely to have security holes?
1302
1303       Yes.
1304
1305       Any program is likely to have security holes, especially when it's net‐
1306       worked. However, I have good reasons to think that Liquid War  is  safe
1307       enough  for  a  game. At least I find it safe enough to run a permanent
1308       public server on my personnal computer 8-)
1309
1310       FYI, here are some things which I think make Liquid War rather safe  to
1311       run:
1312
1313       *  Liquid  War  does  not  store anything on your hard drive that would
1314          have been received from the network. The maps are kept  in  RAM.  So
1315          you won't download any virus playing Liquid War on Internet.
1316
1317       *  Liquid  War  does  not transmit any sort of code on the network. All
1318          the transmitted bytes represent plain data. So you're not likely  to
1319          execute any arbitrary code - virus, worm - when playing on the Net.
1320
1321       *  Liquid  War  receives  network packets in static buffers, and if the
1322          received data is too big, it is truncated. One consequence  is  that
1323          Liquid  War  has a bunch of "limits". You can't send hudge maps over
1324          the network, you can't have long nicknames, and so on.  But  another
1325          consequence  is  that  if  you try to send garbage in the buffer, it
1326          will be truncated. Liquid War will protest with  a  "network  error"
1327          message and the connection will be closed, but there will be no easy
1328          exploit possible here.
1329
1330       *  Liquid War does not use the sprintf, strcpy  and  strcat  functions,
1331          which are known as being rather unsecure since they can lead to buf‐
1332          fer overflows. Instead, it uses the equivalent  functions  snprintf,
1333          strncpy  and  strncat.  On  platforms where these functions are sup‐
1334          ported natively, the game will use  the  default  system  functions,
1335          otherwise  it  will use a free implementation by Mark Martinec. FYI,
1336          Windows does not support snprintf-like functions natively, that  is,
1337          it's a piece of crap.
1338
1339       *  Liquid War is Free Software, so I'm not likely to have put backdoors
1340          in it myself, since anyone can look at the source code 8-)
1341
1342
1343       However, I have not - and I know nobody who has -  audited  Liquid  War
1344       for  security  holes.  So  there  might  be  some. Therefore you should
1345       respect a few things while running Liquid War:
1346
1347       *  Never run Liquid War as root or administrator. This is obvious but I
1348          still  mention  it.  If you want to run a Liquid War daemon on UNIX,
1349          run it as user "nobody"  or  something  approaching.  If  "root"  or
1350          "administrator"  does  not make sense on your system (DOS, Win98...)
1351          then I assume you're not _really_ concerned  about  security  anyway
1352          8-P
1353
1354       *  If  you  run a server 7/7 24/24, use the "-log" option to log every‐
1355          thing in a file. This way you'll keep a trace of  network  activity,
1356          and if something goes wrong, you might get a chance to see it.
1357
1358       *  If  you  use  passwords  in network games, *never* choose a valuable
1359          password. Use something simple like "hello" or "goodbye".
1360
1361       *  Keep in mind that Liquid War is a game, and not a bullet proof  pro‐
1362          fessionnal server.
1363
1364
1365       Last  point:  you  should be aware that version 5.4.5 of Liquid War has
1366       been proved to be vulnerable to a local buffer overflow, and one should
1367       run  at  least  5.5.9  to  get rid of this problem. FYI by the time the
1368       exploit  was  found  on  5.4.5,  5.5.9  was   already   out   8-)   See
1369       http://www.securityfocus.com/bid/8629     and    http://www.securityfo
1370       cus.com/bid/9453 for more informations.
1371
1372
1373       Can people cheat when playing on the Net?
1374
1375       No.
1376
1377       Or at least, not really. In fact, you  can  still  find  the  following
1378       types of lamers:
1379
1380       *  A guy who lets the CPU play at his place. He'll loose anyway because
1381          the CPU is definitely not a great Liquid War Master 8-)
1382
1383       *  A guy who tweaks the game and gets all  his  bots  fight  anyone  he
1384          wishes. That's mean.
1385
1386       *  A  guy  who  manages to let you have a 500msec lag while he does not
1387          have any lag at all.
1388
1389
1390       Apart from this, I can hardly see any way to cheat.  Why?  Because  the
1391       Liquid  War  server does not store any information about the game. It's
1392       not aware of who wins, who looses, it knows nothing. The only thing  it
1393       does is to transmit key presses between client computers.
1394
1395       This way, if someone plays with a tweaked release of Liquid War, think‐
1396       ing he will fool you, then he will fool you on his computer only...  On
1397       your  computer,  everything  will be fine. After some time, your screen
1398       and his screen will have nothing in common, and both players are likely
1399       to think they have won. Except the lamer will stay a lamer.
1400
1401       This  also  explains  why it's required to play with the very same ver‐
1402       sions of the game during network games. If you  plug  a  5.5.2  with  a
1403       5.5.1,  after a minute the screens will be completely different on each
1404       client, since there are subtle differences between the  5.5.1  and  the
1405       5.5.2  engine.  However, you shouldn't be able to do this, since a net‐
1406       work error will stop you before you can start to play.
1407
1408       Additionnally, versions 5.5.5 and higher have a checksum system.  Every
1409       100  rounds,  each client calculates a checksum with its local map, and
1410       sends it to the server. If the checksum is incorrect, the  server  will
1411       log a message like:
1412
1413       Checksum error on client "192.168.1.1:1098"
1414
1415       If you see this, then you're in one of the following situations:
1416
1417       *  There's a bug in the game
1418
1419       *  A lamer tries to cheat
1420
1421
1422       FYI,  all  releases from 5.4.0 to 5.5.4 have a bug which causes clients
1423       to desynchronize after a while...
1424
1425
1426

Command line parameters

1428   Introduction
1429       When you launch Liquid War 5, you can use command line options. If  you
1430       have no problems launching Liquid War, this section should not interest
1431       you very much.
1432
1433       You can use several options at the same  time.  The  basic  syntax  for
1434       options looks like this:
1435
1436       lw -option1 -option2 parameter2 -option3 parameter3 -option4 -option5
1437
1438       Note  that  most  of the options are legacy options which where usefull
1439       with the initial releases of Liquid War, when you had to run in a  Win‐
1440       dows  DOS  box,  and when there were still plenty of 486 computers with
1441       only 8Mb ram...
1442
1443
1444   Version checking
1445       These are basic options which  can  be  usefull  to  figure  out  which
1446       release of Liquid War is installed.
1447
1448       *  "-v" : returns the version number of the program.
1449
1450       *  "-h" : displays a short description and copyright information.
1451
1452
1453
1454   Changing default paths
1455       Very  usefull  options, especially if you can not install Liquid War in
1456       default directories or want to put the game in a special place.
1457
1458       *  "-cfg myconfigfile.cfg" : causes Liquid War  to  use  the  specified
1459          config file.
1460
1461       *  "-dat  mydatafilefile.dat"  : causes Liquid War to use the specified
1462          datafile. This might be a very interesting option if you run  Liquid
1463          War  on a GNU/Linux box where you do not have root access and there‐
1464          fore can not put the datafile in /usr.
1465
1466       *  "-map mycustommapdir" : causes  Liquid  War  to  use  the  specified
1467          directory as the user map directory. The user map directory is where
1468          you can put plain bitmaps to be used as maps.
1469
1470       *  "-tex mycustomtexturedir" : causes Liquid War to use  the  specified
1471          directory  as the user texture directory. The user texture directory
1472          is where you can put plain bitmaps to be used as textures.
1473
1474       *  "-mid mycustommusicdir" : causes Liquid War  to  use  the  specified
1475          directory  as the user music directory. Any midi file placed in this
1476          directory will be added to the list of available musics.
1477
1478       *  "-server myliquidwarserverfile" : causes Liquid War to use the spec‐
1479          ified  file  as the server executable. This option has no effect for
1480          now since the server is not launched by the client.
1481
1482       *  "-mapgen mylwmapgenfile" : causes Liquid War to  use  the  specified
1483          file as the "lwmapgen" executable. "lwmapgen" is an utility by David
1484          Redick which generates random maps automatically for Liquid War. You
1485          might  wish  to change this option if random map generation does not
1486          work for some reason, or if you want to use your own map generator.
1487
1488
1489
1490   Troubleshooting switches
1491       These options give you control on how Liquid War treats  initialisation
1492       errors,  how much memory it should reserve, what kind of video mode sit
1493       should not choose etc...
1494
1495       *  "-vga" : This option forces Liquid War to use your video card as  if
1496          it  was  only  a basic VGA card. This option is required if you play
1497          Liquid War from Windows NT.
1498
1499       *  "-no400300" : This option disables the VGA  400x300  video  mode.  I
1500          created this options for I know that some video cards/monitors don't
1501          support the 400x300 mode.
1502
1503       *  "-silent" : With this option, Liquid War will not play any sound. It
1504          will  not  search for any sound card. This can be interesting if you
1505          don't have any sound card or if Liquid War doesn't handle your  card
1506          correctly.
1507
1508       *  "-nowater" : Causes Liquid War not to load any water sound. Use this
1509          if Liquid War runs short of memory, and you should gain about 850kb.
1510
1511       *  "-nosfx" : Causes Liquid War not to load any sound fx. Use  this  if
1512          Liquid War runs short of memory, and you should gain about 150kb.
1513
1514       *  "-nomusic" : Causes Liquid War not to load any midi music.
1515
1516       *  "-mem  n" : The parameter "n" sets the amount of memory (in Mb) Liq‐
1517          uid War will allocate to do all its calculus. If this number is  too
1518          small,  you  won't  be  able to play on all the levels. If it is too
1519          high, Liquid War may not start at all or crash while you  are  play‐
1520          ing. The default value is 8. If you play Liquid War from Windows and
1521          Liquid War refuses to run because this parameter is too  high,  then
1522          try and give more dpmi memory to Liquid War.
1523
1524       *  "-nojoy" : This option disables joystick support.
1525
1526       *  "-noback"  : Causes Liquid War not to load the background image. Use
1527          this if Liquid War runs short of memory, and you should  gain  about
1528          300kb.
1529
1530       *  "-notex"  :  Causes  Liquid War not to load any texture. Use this if
1531          Liquid War runs short of memory, and you should gain about 750kb.
1532
1533       *  "-auto" : If you set this option,  Liquid  War  won't  generate  any
1534          error while allocating memory or loading data.
1535
1536       *  "-safe"  :  With this option, you will play with a very reduced ver‐
1537          sion of Liquid War. It looks rather ugly but should work  in  a  DOS
1538          box with only 4Mb of DPMI memory. Use this if you experience serious
1539          memory or device problems. If Liquid War  doesn't  start  with  this
1540          option turned on, I really don't think I can do anything for you...
1541
1542       *  "-nice"  :  With  this  option,  Liquid War will use a mode which is
1543          between the default mode and the "safe" mode.
1544
1545       *  "-check" : With this option, Liquid War will  stop  as  soon  as  it
1546          detects something strange while initializing.
1547
1548       *  "-stop"  :  If you set this option, Liquid War will prompt you for a
1549          key when the init process is completed.
1550
1551       *  "-c" : This is a weird option, if you turn it on, the game will only
1552          use  fonctions which are programmed in C langage. The default behav‐
1553          iour is to use some functions I rewrote in assembly langage, so that
1554          the game is a little faster.
1555
1556
1557
1558   Debug options
1559       These  options  are  usefull  if  you  want to debug the game and trace
1560       what's happening.
1561
1562       *  "-netlog" : Dumps all the network traffic on  the  standard  output.
1563          This  can help finding problems when trying to connect to the server
1564          in a network game.
1565
1566
1567
1568   Server options
1569       The server command line options are  described  in  the  section  which
1570       deals  which  network games in general. IMHO you need to understand how
1571       network works in LW before trying to tweak the server 8-)
1572
1573
1574   Other options
1575       Everything else 8-)
1576
1577       *  "-capture" : Activates the capture mode. In this mode, the game will
1578          dump a .bmp file on the disk several times per second, which is use‐
1579          full if you want to create an mpeg movie of your game session after‐
1580          wards.  You can also activate this mode interactively by pressing F9
1581          within the game.
1582
1583       *  "-metaserver url" : redefines the URL of the meta-server. Usefull if
1584          you want to use your own meta-server.
1585
1586       *  "-nobeep"  :  Disables  the  system beeps that the application might
1587          fire. These beeps are mostly used on the server  to  notify  clients
1588          connections.
1589
1590       *  "-tombola" : Activates a special mode where scores are not displayed
1591          normally. Instead, the game displays 3 random numbers  between  1  -
1592          500.
1593
1594
1595
1596   lwmapgen options
1597       The  external lwmapgen program by David Redick accepts a number of com‐
1598       mand line options. You can type:
1599
1600       liquidwar-mapgen --help
1601
1602       to get a list of all available options under UNIX.  Under  Windows  the
1603       command would be:
1604
1605       lwwinmap --help
1606
1607       Note that lwmapgen is called automatically by Liquid War when you click
1608       on the "Random map" button.
1609
1610       The idea behind lwmapgen is that you choose a function which  sets  the
1611       type  of  map  generated, and then pass various arguments to this func‐
1612       tion. If you do not explicitly choose a function, one will be picked up
1613       for you randomly, and all other parameters will use default values.
1614
1615       The most usefull and common options are:
1616
1617       *  "--help" : displays help.
1618
1619       *  "--out filename" : save bitmap to filename.
1620
1621       *  "--size n" : bitmap size (an integer between 0 and 5).
1622
1623       *  "--list" : list all available functions.
1624
1625       *  "--function function_name" : which function to use.
1626
1627
1628       Here's a typical use of lwmapgen:
1629
1630       liquidwar-mapgen --size 3 --function hole --out test.bmp
1631
1632

Platform specific issues

1634   General remarks
1635       Liquid  War is now a cross-platform game, thanks to Allegro. So now you
1636       can play under different OS.
1637
1638       The same source tree will compile on all supported platforms, but  with
1639       slight  differences  when  running. C preprocessor #defines are used to
1640       code some platform specific stuff, and in some cases there are  differ‐
1641       ent files for the DOS, Windows and UNIX versions.
1642
1643       As I said, I try to use the same code for all platforms. This is in the
1644       long term the best choice. Otherwise there would different branches  of
1645       the source tree, and I don't think this is a very good solution.
1646
1647       Therefore  some  optimizations  that were performed in the old DOS-only
1648       version have been totally removed, for they were 100%  platform  depen‐
1649       dent  (ie  mode-X  asm  coding).  So  the new versions are all a little
1650       slower than the old 5.1 stuff, but the performance loss is  only  about
1651       20%, which is not significant with today's PCs. And anyways the perfor‐
1652       mance loss is most of the time limited to the goog  old  VGA  320x200x8
1653       mode-X, which starts being kind of obsolete.
1654
1655
1656   DOS
1657       This  is  the  original version. It's the fastest one as far as I know,
1658       the safest one and it will always be I think, since Allegro  was  first
1659       designed  for  DOS,  and DOS allows a full unconditionnal access to all
1660       the hardware ressources LW requires. LW doesn't use any hardware accel‐
1661       eration  and  it's not been designed to do so. Unfortunately there's no
1662       network support for the DOS version of Liquid War.
1663
1664
1665   Windows
1666       When running under a Windows box, the DOS release used to be safer than
1667       the  native  Windows  port. Now that DOS support is getting really poor
1668       with recent versions of Windows, the native Windows release  of  Liquid
1669       War  starts  begin  the  good choice for Windows users. And Allegro for
1670       Windows is getting quite stable in the 4.x series.
1671
1672       The other reason to choose this release rather than the DOS release  is
1673       that it has network support.
1674
1675       If you have problems running Liquid War under Windows, please check out
1676       the "data\lwwin.log" file which should be written each time you run the
1677       game.  It  contains  the  information which is displayed on the console
1678       under other platforms, and might give you a  clue  about  what's  going
1679       wrong.
1680
1681
1682   GNU/Linux
1683       This port is the most recent one, and also the one I prefer. Paths have
1684       been changed to an UNIXish style, ie the data is stored in:
1685
1686       /usr/local/share/games/liquidwar
1687
1688       the executable in:
1689
1690       /usr/local/games
1691
1692       and the configuration file is
1693
1694       ~/.liquidwarrc
1695
1696       Since not all GNU/Linux distributions have  /usr/local/games  in  their
1697       path,  I  also put a symbolic link to the binaries in /usr/local/bin. I
1698       believe Liquid War is quite FHS compliant, so if its  default  directo‐
1699       ries do not match your configuration, blame your distro for not follow‐
1700       ing  the  standards  8-)   AFAIK   the   only   touchy   directory   is
1701       /usr/local/share/pixmaps  which I've seen on many distribution but does
1702       not seem to be referenced in the FHS.
1703
1704       With the latest releases of Allegro, Liquid War is becoming pretty sta‐
1705       ble  under  GNU/Linux.  You should also know that the GNU/Linux port is
1706       usually the most up to date, since I very very seldom boot  Windows  at
1707       home and do most of the coding under GNU/Linux.
1708
1709
1710   FreeBSD
1711       This  is  the  latest  port,  so  I  expect it to be a little touchy to
1712       install and/or run for some time.
1713
1714       Note that to compile the game you'll need to  install  GNU  tools  like
1715       gmake  and  gcc.  Liquid War won't compile with the genuine make and cc
1716       commands.
1717
1718       One thing you might ask is: "why do you provide the binary as  a  plain
1719       .tgz  file,  it would be much nicer if a standard FreeBSD port was pro‐
1720       vided instead!". The answer is that the statically linked binary should
1721       work flawlessly and does not raise any dependency problem. Also I don't
1722       know how to make a BSD port and I'm not really interested in doing  it.
1723       If  it's  easy to do, then someone can simply do it and send it back to
1724       me. If it's hard to do, then I do not really have the time nor  motiva‐
1725       tion  to do it. What I did is make the code and install scripts FreeBSD
1726       friendly so that it would be possible to compile the game  under  Free‐
1727       BSD. Packaging is another story.
1728
1729
1730   Mac OS X
1731       There's  currently  a  beta  version of a Mac OS X port for Liquid War.
1732       Ryan D. Brown nicely managed to compile and run the game under  Mac  OS
1733       X,  and  the  latest  news was that it does basically work. Still, this
1734       port did not go through intensive testing, so there might still be some
1735       bugs, expecially concerning networking.
1736
1737       There  were  some  byte  endianess  problems  in  previous  ( <=5.5.8 )
1738       releases of LW, but I tried to fix them and they should be gone now.
1739
1740       As of today, we're trying to find out a convenient way to  package  and
1741       release  the  Mac OS X version of LW. You can contact us on the mailing
1742       list if you're interested in this port.
1743
1744
1745   GP2X
1746       Liquid War has been ported to the GP2X handheld gaming platform, thanks
1747       to  the fact George Foot ported Allegro to this platform. More informa‐
1748       tions on http://www.glost.eclipse.co.uk/gfoot/gp2x/allegro.html
1749
1750       Assuming the environment variables  GP2X_USER_PREFIX  (where  you  want
1751       Allegro  to  be  installed) and OPEN2X_SYSTEM_PREFIX (where your open2x
1752       cross-compiler is) are defined, the following might be used to  compile
1753       Allegro:
1754
1755       LDFLAGS=-static          ./configure         --prefix=$GP2X_USER_PREFIX
1756       --build=x86_64-pc-linux-gnu                     --host=arm-open2x-linux
1757       --enable-lgp2x=$OPEN2X_SYSTEM_PREFIX     --without-x    --enable-static
1758       --disable-shared --disable-modules --enable-dbglib
1759
1760       Then Liquid War itself can be compiled using:
1761
1762
1763
1764

User levels

1766   A piece of advice
1767       You can use your own levels whith Liquid War 5. The only thing you have
1768       to  do  is to put your own 256-colors vbitmap files in a special direc‐
1769       tory, and the program will use them. Currently, BMP, LBM, PCX, and  TGA
1770       files  are supported. It is a good thing to use 256 colors bitmaps, for
1771       they waste less disk space than truecolor bitmaps,  and  Liquid  War  5
1772       converts  all  bitmaps  to  32 colors bitmaps. Additionnally, truecolor
1773       bitmaps might cause the DOS version to crash randomly...  2-color  bit‐
1774       maps will also cause the program to crash. I warned you!
1775
1776       The  best thing you can do to create your user levels is to have a look
1777       at the few user files I put in the .zip file and try  at  first  to  do
1778       something that looks about the same!
1779
1780
1781   Maps
1782       Liquid  War  5  does  many checks on user levels and is much safer than
1783       Liquid War 3. Still, try and help the program not to crash,  if  possi‐
1784       ble.
1785
1786       Liquid  War  considers that dark colors are walls and bright colors are
1787       associated to the playable area. So you can draw your walls  in  black,
1788       dark  blue,  etc...  And the rest of the map can be of any bright color
1789       such as white or yellow.
1790
1791       You can draw a small map on a big bitmap, as long as you use  a  bright
1792       background  color. Liquid War will autodetect the range of your map and
1793       add the border line if necessary.
1794
1795       Liquid War re-orders all the maps, so that the smallest ones are on the
1796       left  and  the  most complicated ones on the right when you choose them
1797       with the slider in the "map" menu. So if you can't  find  the  map  you
1798       just  draw, don't worry, it is probably just mixed with the levels from
1799       the .dat file.
1800
1801       The  default  path  for  maps  is   "custom\map\"   on   windows,   and
1802       "/usr/local/share/games/liquidwar/map" on GNU/Linux.
1803
1804
1805   Textures
1806       All  you  have  to do is put a bitmap in the default directory which is
1807       "custom\texture\"  on  windows,   and   "/usr/local/share/games/liquid‐
1808       war/texture" on GNU/Linux.
1809
1810
1811   Textures
1812       As  of  Liquid  War 5.6.x, it's possible to associate a map with a tex‐
1813       ture. All you need is to call the maps with  the  same  name  (case  is
1814       important,  lowercase  recommendend...).  Look at the "meditate" custom
1815       map which is shipped with Liquid War for instance.
1816
1817       This also works  with  internal  builtin  maps  (those  stored  in  the
1818       datafile)  so for instance if you name a custom texture "world1.bmp" it
1819       will automatically be associated to the builtin map world1  (to  figure
1820       out  internal names you have to unpack the source distribution and look
1821       in the ./data directory). This also works the other way, if you name  a
1822       map  "wood2.bmp"  it  will be automatically associated with the builtin
1823       texture wood2.
1824
1825       Associating a texture with a map requires more work  than  designing  a
1826       simple  map,  but  the results is usually much nicer. See the "Kasper -
1827       ..." series of maps for instance.
1828
1829
1830   Send your levels
1831       Maybe you will find that the original levels are ugly  and  unplayable.
1832       Well,  if you have made user levels and think they are great, just send
1833       them to the Liquid War user mailing list. Please use  only  256  colors
1834       bitmap  and zip them before sending them, or else they might be blocked
1835       by my provider...
1836
1837       As of today, dozens of user maps have already been included  in  Liquid
1838       War,  this  is very nice for it happens that every map designer has his
1839       own personnal tastes, so the maps all look different.
1840
1841       Still, to be included in Liquid  War's  mainstream  distribution,  your
1842       maps  will  need to be placed under the terms of the GNU General Public
1843       License, or at least a compatible license. You should have  received  a
1844       copy of this license with Liquid War anyway. Read it 8-)
1845
1846       Of course, you can use *any* map when playing. You can even play with a
1847       bitmap you got from a proprietary source - such a proprietary game  you
1848       bought  for  instance  -  but the point is that I can't - and you can't
1849       either - distribute such a map along with Liquid War.
1850
1851       However, this is enough legal boring stuff! What  you  should  keep  in
1852       mind  is  that  I'm  always happy when I receive maps from players, and
1853       it's a pleasure for me to include them in the mainstream distribution.
1854
1855

Core algorithm

1857   Introduction
1858       General remarks
1859
1860       If you have played Liquid War, you must have  noticed  that  your  army
1861       always  takes  the shortest way to reach the cursor. So the fundamental
1862       stuff in Liquid War is path-finding. Once you've done that the game  is
1863       quite  easy  to code. Not harder than any other 2D game. Still the path
1864       finding algorithm is an interesting one, for it's not a  common  method
1865       that we used.
1866
1867       Basically,  at  each round (by round I mean a game logical update, this
1868       occurs 10 or 100 times/sec depending on the level and/or your machine),
1869       the  distance from all the points of the level to your cursor is calcu‐
1870       lated. Now the point is to calculate this fast, real fast. In  fact,  a
1871       "gradient" is calculated for all the points of the level, and the value
1872       of this gradient is the distance required for a little pixel/fighter to
1873       reach  your cursor, assuming that he takes the shortest way. Liquid War
1874       does this with a 10% error tolerance, and it's enough for  keeping  the
1875       game interesting.
1876
1877       Once  you  have  this  gradient  calculated, it's not hard to move your
1878       fighters. Basically, you just have to move  them  toward  the  adjacent
1879       point  that  has  the  lowest gradient value, ie is the closest to your
1880       cursor.
1881
1882
1883       History
1884
1885       The Liquid War algorithm has been invented by my friend Thomas  Colcom‐
1886       bet  In fact the Liquid War algorithm has been invented before the game
1887       itself. The game came as  a  consequence  of  the  algorithm,  he  just
1888       thought "mmm, cool, we could make a game with that!".
1889
1890       Later, I enhanced the algorithm, as I coded it. The consequences were a
1891       performance increase, especially on simple but big levels. I mean  lev‐
1892       els with wide areas for teams to move. Still the basis of the algorithm
1893       remained the same.
1894
1895
1896       Pros
1897
1898       The Liquid War algorithm for path-finding is very efficient:
1899
1900       *  When you have to move lots of different  points  toward  one  single
1901          point. Good thing that's the rule of Liquid War!
1902
1903       *  When  you  have no clue about how your map will look like, ie if the
1904          walls are randomly placed.  The  complexity  of  the  level  doesn't
1905          influence  much  the  speed of the algorithm. The size does, but the
1906          complexity, ie the number of walls, is not so important.
1907
1908
1909
1910       Cons
1911
1912       The Liquid War algorithm is very  poor  compared  to  other  algorithms
1913       when:
1914
1915       *  You have several target destinations, that's to say Liquid War would
1916          be really slow if there were 100 teams with 10 players only.
1917
1918       *  You want to move one single point only.
1919
1920       *  > You want the exact (100% sure) path. In fact, this algorithm finds
1921          solutions  which  approach the best one but you can never figure out
1922          if the solution you found is the best, and the algorithm never ends.
1923          In  the  long  term,  the algo will always find the best solution or
1924          something really close but I don't know any easy way to  figure  out
1925          when you have reached this state.
1926
1927
1928
1929
1930   Mesh
1931       Introduction
1932
1933       The first Liquid War algorithm used to calculate the gradient (the dis‐
1934       tance from a point to your cursor) for every single point of the map.
1935
1936       With Liquid War 5, I used a mesh system. This mesh system is  a  struc‐
1937       ture  of squares connected together. Squares may be 1,2,4,8 or 16 units
1938       large or any nice value like that, and the gradient is only  calculated
1939       once  for  each square. Squares have connections between them, and each
1940       connection is associated to a direction.
1941
1942       There are 12 directions:
1943
1944       *  North-North-West (NNW)
1945
1946       *  North-West (NW)
1947
1948       *  West-North-West (WNW)
1949
1950       *  West-South-West (WSW)
1951
1952       *  South-West (SW)
1953
1954       *  South-South-West (SSW)
1955
1956       *  South-South-East (SSE)
1957
1958       *  South-East (SE)
1959
1960       *  East-South-East (ESE)
1961
1962       *  East-North-East (ENE)
1963
1964       *  North-East (NE)
1965
1966       *  North-North-East (NNE)
1967
1968
1969
1970       Example
1971
1972       Well, let me give you an example, supposing that  you  level  structure
1973       is:
1974
1975       **********
1976       *        *
1977       *        *
1978       *       **
1979       *        *
1980       **********
1981
1982       The * represent walls, that's to say squares where fighters can not go.
1983
1984       Then the mesh structure would be:
1985
1986       **********
1987       *11112233*
1988       *11112233*
1989       *1111445**
1990       *i1114467*
1991       **********
1992
1993       In this mesh, there are 7 zones:
1994
1995       *  zone 1 has a size of 4. It's linked with zones 2 (ENE) and 4 (ESE).
1996
1997       *  zone  2 has a size of 2. It's linked with zones 3 (ENE,ESE), 5 (SE),
1998          4 (SSE,SSW) and 1 (SW,WSW,WNW).
1999
2000       *  zone 3 has a size of 2. It's linked with zones 5 (SSW), 4 (SW) and 2
2001          (WSW,WNW).
2002
2003       *  zone  4 has a size of 2. It's linked with zones 2 (NNW,NNE), 4 (NE),
2004          5 (ENE), 6 (ESE) and 1 (WSW,WNW,NW).
2005
2006       *  zone 5 has a size of 1. It's linked with  zones  3  (NNW,NNE,NE),  7
2007          (SE), 6 (SSE,SSW), 4 (SW,WSW,WNW) and 2 (NW).
2008
2009       *  zone  6  has  a  size  of  1.  It's linked with zones 5 (NNW,NNE), 7
2010          (ENE,ESE) and 4 (WSW,WNW,NW).
2011
2012       *  zone 7 has a size of  1.  It's  linked  with  zones  5  (NW)  and  6
2013          (WSW,WNW).
2014
2015
2016
2017       Why such a complicated structure?
2018
2019       Because it allows the module which calculates the gradient to work much
2020       faster. With this system, the number of zones is  reduced  a  lot,  and
2021       calculus  on  the  mesh  can  go very fast. At the same time, this mesh
2022       structure is complicated to understand by us humans but it's very  easy
2023       for the computer.
2024
2025
2026
2027   Gradient
2028       Introduction
2029
2030       For  each  zone defined in the mesh, LW calculates an estimation of the
2031       distance between the cursor and this zone.
2032
2033       The algorihm is based on the fact that to cross a zone which size is n,
2034       n movements are required. Easy, eh?
2035
2036
2037       Description
2038
2039       Here's the way the algorithm works:
2040
2041       for each turn of the game, do:
2042
2043       *  pick  up a direction between the 12 defined directions. They have to
2044          be chosen is a peculiar order to avoid weird behaviors  from  fight‐
2045          ers,  but  let's suppose we just pick up the "next" direction, ie if
2046          WSW was chosen the last time, we pick up WNW.
2047
2048
2049       and then for each zone in the mesh, do:
2050
2051       *  Compare the potential of the current zone with that of its  neighbor
2052          zone. The neighbor zone to be chosen is the one which corresponds to
2053          the direction which has been previously picked up, and by  potential
2054          I  mean  "the  distance  to the cursor, estimated by the algorithm's
2055          last pass".
2056
2057       *  If potential_of_the_neighbor_zone > (potential_of_the_current_zone +
2058          size_of_the_current_zone)   then   potentiel_of_the_neighbor_zone  =
2059          potential_of_the_current_zone + size_of_the_current_zone
2060
2061
2062
2063       How can this work?
2064
2065       Well, just ask my friend thom-Thom, he's the one who had  the  idea  of
2066       this algorithm!
2067
2068       The  basic  idea is that by applying this simple rule to all the zones,
2069       after a certain amount of time, it's impossible to find  any  place  in
2070       the  mesh  where  the  rule is not respected. And at this time, one can
2071       consider the potiential is right in any point.
2072
2073       Of course when the cursor moves the potential has to  be  recalculated,
2074       but you see, cursors move really slowly in Liquid War, so the algorithm
2075       has plenty of time to find a new stable solution...
2076
2077
2078       Demo
2079
2080       It's possible to see this algorithm working by typing:
2081
2082       ufootgrad[n]
2083
2084       while playing, where [n] is the number of  the  team  the  gradient  of
2085       which you want to view. The game is still running but you view a team's
2086       gradient being calculated in real time instead of seeing the fighters.
2087
2088       If you type ufootgrad0 the display comes back to normal mode.
2089
2090
2091
2092   Move
2093       Introduction
2094
2095       Once the gradient is calculated for any zone on the  battlefield,  it's
2096       quite easy to move the fighters, hey?
2097
2098       The following method is used to move the players:
2099
2100       *  A "main direction" is chosen for the fighter, this direction is cho‐
2101          sen using the gradient calculated on the mesh.
2102
2103       *  Knowing which direction is the main one, a "level  of  interest"  is
2104          applied to the 12 defined directions.
2105
2106
2107       There are 4 "level of interest" for directions:
2108
2109       *  Main directions: the direction calculated.
2110
2111       *  Good  directions:  these  directions  should lead the fighter to the
2112          cursor.
2113
2114       *  Acceptable directions: ok, one can use  this  direction,  since  the
2115          fighter shouldn't loose any time using it.
2116
2117       *  Unpossible directions: wether there's a wall or using this direction
2118          means the fighter will be farer from  his  cursor  than  before,  it
2119          always means that this direction will not be used, never.
2120
2121
2122
2123       Rules
2124
2125       The  fighters will try to find any matching situation in this list, and
2126       chose the first one.
2127
2128       *  The main direction is available, no one on it, OK, let's follow it.
2129
2130       *  There's a good direction with no one on it, OK, let's follow it.
2131
2132       *  There's an acceptable direction with no one on it, OK, let's  follow
2133          it.
2134
2135       *  The  main  direction  is available, but there's an opponent on it, I
2136          attack! By attacking, one means that  energy  is  drawned  from  the
2137          attacked  fighter and transmitted to the attacker. When the attacked
2138          fighter dies, he belongs to the team which killed him.
2139
2140       *  A good direction is available, but there's  an  opponent  on  it,  I
2141          attack!
2142
2143       *  The  main  direction  is available, but there's a mate on it, I cure
2144          him. That's to say that energy is given to the mate. This way,  when
2145          there's  a big pool of fighters from the same team, they re-generate
2146          each other.
2147
2148       *  None of the previous situations found, do nothing.
2149
2150
2151
2152       Tips and tricks
2153
2154       The behavior of the armies is quite tricky to set up. I had  myself  to
2155       try  many algorithms before I came to something nice. In fact, I had to
2156       introduce some "random" behaviors. They are not  really  random  for  I
2157       wanted  the game to behave the same when given the same keyboard input,
2158       but for instance, fighters will prefer NNW to NNE sometimes, and NNE to
2159       NNW  some  other times. By the way, I think Liquid War could stand as a
2160       nice example of the thoery of chaos.
2161
2162
2163

Source code

2165   General remarks
2166       Modularity
2167
2168       Liquid War 5 is basically a big C program.  I've  splitted  the  source
2169       code  in many small files for I do not like to have to handle big mono‐
2170       lithic sources, but this does not mean Liquid War is very  modular.  In
2171       fact Liquid War 5 is quite bloated with global variables and other ugly
2172       stuff 8-(
2173
2174
2175       Coding style
2176
2177       To be honest, it's a big mess. You won't find 2 files coded in the same
2178       maner...  OK,  I'm  exagerating a bit. From now I try to make an effort
2179       and stick to basic rules such as:
2180
2181       *  use the GNUish-style indentation - the default Emacs mode in fact
2182
2183       *  prefix global  functions  /  variables  /  constants  /  types  with
2184          lw_<NAME_OF_THE_file>_. For instance, a "do_it" function in myfile.c
2185          will be called lw_myfile_do_it
2186
2187       *  use capitals for constants, globals and types  only.  All  functions
2188          are in lowercase with "_" to separate words
2189
2190       *  keep  on using 8.3 filenames for .c source files. This is for better
2191          DOS integration. DOS version of Liquid War is still maintained,  you
2192          know 8-)
2193
2194       *  use English only for code and comments
2195
2196
2197       I  might decide to rename and cleanup everything some day, for it would
2198       help other coders to understand what I wrote, but well,  this  is  cer‐
2199       tainly not a thrilling task 8-/
2200
2201
2202
2203   Source files organization
2204       Main game code
2205
2206       Here  you'll  find  the  main()  function, the main game loop, applica‐
2207       tion-wide constants and other global stuff.
2208
2209       It might be a good start if you want to hack the code.
2210
2211       *  base.h: contains global constants used in many different files.
2212
2213       *  game.c / game.h: contains the main game loop.
2214
2215       *  main.c / main.h: the file where the main  C  function  is  declared.
2216          Doesn't  contain  much except calling init functions and running the
2217          GUI.
2218
2219
2220
2221       Menus
2222
2223       The menus are coded using the Allegro GUI system. While this system  is
2224       very  powerfull, it's IMHO not adapted to very complex GUIs, and one of
2225       its drawbacks is that it's not  so  easy  to  redesign  something  once
2226       you've coded it.
2227
2228       Besides,  when  I  started coding the GUI in 1998, I did it in a rather
2229       ugly way, and now I'm paying for my being lazy at that  time,  since  I
2230       spent hours coding when I want to change something 8-/
2231
2232       *  about.c / about.h: contains the code for the about menu.
2233
2234       *  advanced.c / advanced.h: contains the GUI advanced options menu.
2235
2236       *  connect.c  /  connect.h:  contains code for the "connect" menu which
2237          displays which players are connected to the server, before the  game
2238          actually starts.
2239
2240       *  controls.c / controls.h: contains the code for the controls menu.
2241
2242       *  graphics.c / graphics.h: code for the graphic options menu.
2243
2244       *  internet.c  /  internet.h:  contains  the  code  for the "Search for
2245          Internet games" menu, where one can pick up a running  server  auto‐
2246          matically with the help of the meta-server.
2247
2248       *  language.c / language.h: contains the code for the "Language" menu.
2249
2250       *  level.c  /  level.h: contains code for the menu where the player can
2251          select a level and its options (texture or color).
2252
2253       *  menu.c / menu.h: contains the code for the main menu.
2254
2255       *  netgame.c / netgame.h: contains the code for the net game menu.
2256
2257       *  options.c / options.h: contains the code for the options menu.
2258
2259       *  play.c / play.h: contains the code which ties the menu to  the  main
2260          gameloop.
2261
2262       *  rules.c / rules.h: code for the rules menu.
2263
2264       *  score.c / score.h: functions to display the scores at the end of the
2265          game.
2266
2267       *  speeds.c / speeds.h: contains the code for the speeds menu.
2268
2269       *  team.c / team.h: code for the team  menu,  where  one  choses  which
2270          teams will play.
2271
2272       *  volume.c / volume.h: code for the sound menu.
2273
2274       *  wave.c / wave.h: code for the wave menu.
2275
2276
2277
2278       GUI tools
2279
2280       These files contain various utilities which are used in the menus.
2281
2282       *  alleg2.c  /  alleg2.h:  contains  some  tweaked allegro functions. I
2283          wanted to use bitmaps with sevral colors for my  fonts,  and  change
2284          some  of  the allegro default behavior. So rather than modifying the
2285          allegro source code right in the library I copied it  in  this  file
2286          and then modified it.
2287
2288       *  back.c / back.h: this modules displays the background image.
2289
2290       *  dialog.c / dialog.h: contains code for standard dialog boxes.
2291
2292       *  error.c / error.h: contains functions to display error messages once
2293          the game is in graphical mode.
2294
2295       *  help.c / help.h: generic  functions  to  display  the  various  help
2296          pages.
2297
2298
2299
2300       Core algorithm
2301
2302       Here's  *the*  interesting part. All the rest of the code is just sugar
2303       coat to display stuff, receive players commands, communicate with other
2304       computers, handle errors, etc... But the real thing is here!
2305
2306       It's funny to note that these files have almost not been modified since
2307       Liquid War 5.0.
2308
2309       It's also interesting to note that they represent a small percentage of
2310       the  total  amount  of  code in the game. This tends to prove - and I'm
2311       convinced of it - that game programming does not only consists in  hav‐
2312       ing  great  ideas,  but also requires a lot of "dirty" and boring work.
2313       Honestly, coding an option menu is as boring as coding Liquid War algo‐
2314       rithm is fun.
2315
2316       *  fighter.c  /  fighter.h:  contains code to move the armies, once the
2317          gradient has been calculated.
2318
2319       *  grad.c / grad.h: this module calculates the gradient for each  team.
2320          One  could  say it's the "kernel" of the game, since most of the CPU
2321          time is spent in this module (except if you have a slow display...).
2322
2323       *  mesh.c / mesh.h: contains code to set up a usable mesh with  a  map.
2324          Mesh  are re-calculated at each time a new game is started, the rea‐
2325          son for this being that meshes are *very* big so  it  would  not  be
2326          reasonnable to save them directly on the HD.
2327
2328       *  monster.s / monster.h: assembly functions to speed-up the game. It's
2329          a replacement for some fighter.c functions.
2330
2331       *  spread.s / spread.h: contains assembly replacements for  some  func‐
2332          tions  of  grad.c.  These replacements do the same than the original
2333          ones from grad.c, but faster. Could still be optimized.
2334
2335
2336
2337       Moving cursors
2338
2339       It looks like nothing, but moving a cursor and deciding where it should
2340       go if there's a wall in front of it is not that easy, especially if you
2341       want things to work nicely.
2342
2343       *  autoplay.c / autoplay.h: contains the code for the computer AI. This
2344          module  simulates keypresses from the computer, then the computer is
2345          handled as any other player.
2346
2347       *  move.c / move.h: provides an API to move the cursors.
2348
2349
2350
2351       User input
2352
2353       Until 5.4.0, Liquid War did not have network support. As it is designed
2354       to  be multiplayer, one needed to have several players on the same com‐
2355       puter. The mouse also needed to be handled in a special way since  cur‐
2356       sors  can  *not*  pass walls in Liquid War. Additionnally, I wanted all
2357       input channels (keyboard mouse and joystick) to be handled in a unified
2358       way.
2359
2360       This  explains  why there's so much code for user input, when one would
2361       think at first sight that "polling the keyboard is enough".
2362
2363       *  joystick.c / joystick.h: contains code to support joystick input. It
2364          wraps  joystick  buttons  to virtual keyboard keys, so that joystick
2365          and keyboard behave exactly the same.
2366
2367       *  keyboard.c / keyboard.h: contains code to handle key presses.
2368
2369       *  mouse.c / mouse.h: wraps the mouse  movements  to  virtual  keyboard
2370          keys. This way the mouse can be used to control the players.
2371
2372
2373
2374       Initialisations
2375
2376       These  files  contain  functions  to intialize various game components.
2377       100% boring code.
2378
2379       *  area.c / area.h: contains functions to create the game  area.  Basi‐
2380          cally  it  contains functions to create the data structures in which
2381          the level is stored during the game.
2382
2383       *  army.c / army.h: functions to create the armies, and place  them  on
2384          the battlefield.
2385
2386       *  asm.c  /  asm.h:  various  constants, macros and utilities to ensure
2387          that asembly code works correctly.
2388
2389       *  bigdata.c / bigdata.h: I had a really  hard  time  with  the  malloc
2390          function  with DJGPP under Win95 dos box. I tried to have it working
2391          for hours and hours but my program kept being buggy. So I decided to
2392          allocate  the  memory  myself, in a memory zone I create at startup.
2393          This is what this module does: create a huge memory  zone  and  then
2394          give parts of it to the rest of the program.
2395
2396       *  config.c / config.h: contains everything that is related to the game
2397          configuration. This module contains  in  global  variables  all  the
2398          parameters that are stored in the config file.
2399
2400       *  cursor.c / cursor.h: contains the code to init the cursors and place
2401          them on the battlefield at the beginning of the game.
2402
2403       *  decal.c / decal.h: This module makes  the  link  between  teams  and
2404          players.  Its  coding  is  quite ugly, for some modules in LW assume
2405          that when 2 teams are playing they are always teams 0 and 1. So when
2406          3  teams  are playing are playing and the second team loses, one has
2407          to make team 2 become team 1. That's what this module is for.
2408
2409       *  exit.c / exit.h: contains code that is executed when the game  ends,
2410          it shuts down Allegro and displays messages on the console.
2411
2412       *  gfxmode.c  /  gfxmode.h:  contains  code to set up the various video
2413          modes, and defines which modes are available for each platform.
2414
2415       *  init.c / init.h: contains code to  initialize  Allegro  with  proper
2416          options and analyze failures.
2417
2418       *  palette.c / palette.h: contains function to set up the current color
2419          palette. Liquid War uses different palettes, depending on what  col‐
2420          ors are chosen for teams.
2421
2422
2423
2424       Graphics
2425
2426       Here lies most of the graphic functions in Liquid War. There's not that
2427       much code since Liquid War's strength is not its  visual  effects,  but
2428       rather its gameplay.
2429
2430       The only "funny" thing is the wave effect. I'm quite happy with it, and
2431       honestly, I do think it is rather fast, given the fact that it uses  no
2432       3D hardware at all.
2433
2434       *  disp.c / disp.h: contains functions to display the battlefield.
2435
2436       *  distor.c  /  distor.h: this module contains code to create the "wave
2437          effect". It uses a lot of data tables, and is quite  complicated  to
2438          understand...
2439
2440       *  glouglou.s  /  glouglou.h:  assembly module, it is a replacement for
2441          some functions of distor.c. It goes much faster but does the same.
2442
2443       *  info.c / info.h: contains code to display the info bar. The info bar
2444          is the bar which display the time left and the amount of players for
2445          each team while the game is running.
2446
2447       *  message.c / message.h: provides an API to  display  messages  during
2448          the  game.  Very useful if you want to debug the game: you can trace
2449          and display anything.
2450
2451       *  pion.c / pion.h: contains code to display the cursors.
2452
2453       *  viewport.c / vieport.h: code to allocate and resize the  zone  where
2454          the map is displayed, also called "viewport".
2455
2456
2457
2458       Sound and music
2459
2460       Sound  and  music  routines required some encapsulation, since the game
2461       must be able to run even if the sound and/or music did  not  load  cor‐
2462       rectly.
2463
2464       *  music.c / music.h: contains the code to control MIDI playback.
2465
2466       *  sound.c / sound.h: functions to play sound.
2467
2468
2469
2470       Data management
2471
2472       These functions handle the datafile contents and also the custom data.
2473
2474       Note  that the various utilities such as liquidwarcol, liquidwarmap and
2475       liquidwartex do not share code with the main executable. This is  obvi‐
2476       ously  a design error, for liquidwarmap will handle maps in a very poor
2477       way and is unable to autodetect map errors, whereas the  game  does  it
2478       rather well. Blame the programmer.
2479
2480       *  disk.c  / disk.h: contains all the code to access data from the hard
2481          drive. In fact, all the HD access is done at startup.
2482
2483       *  map.c / map.h: contains code to load the maps from  a  datafile  raw
2484          data or a user defined bitmap to a usable structure in RAM.
2485
2486       *  maptex.c  /  maptex.h: contains code to handle the "use default tex‐
2487          ture" option, and associate a map with  a  given  texture  automati‐
2488          cally.
2489
2490       *  texture.c  /  texture.h:  contains code to handle textures. Textures
2491          are stored in a special format which uses 5 bits per pixel.
2492
2493
2494
2495       Random map generator
2496
2497       Liquid War has a "generate  random  map"  feature  which  is  available
2498       within  the  game  and also as an external program. The source code for
2499       the external program is in ./utils/lwmapgen in Liquid War  source  dis‐
2500       tribution.  This program has been coded by David Redick, is also avail‐
2501       able  on  http://www.cs.clemson.edu/~dredick/lwmapgen/  and  works   on
2502       GNU/Linux.  Compiling this program under DOS and/or Windows is untested
2503       and unsupported.
2504
2505       The random map generator within Liquid War - which of course  works  on
2506       any  platform support by LW - uses for its greater part the same source
2507       code as the external lwmapgen program.
2508
2509       *  random.c / random.h: wrapper for the map generator written by  David
2510          Redick. It basically does the same as ./utils/lwmapgen/main.c except
2511          that it does it within Liquid War as it is running  and  not  in  an
2512          external independant program.
2513
2514
2515
2516       Time handling
2517
2518       Time handling is fundamental in a game. Time is used for visual effects
2519       (waves...) during the game, it's used to generate  some  pseudo  random
2520       stuff, well, it's used everywhere!
2521
2522       Note  that  on the client, I use 2 "different" clocks. The first counts
2523       the "real" time, in seconds. The second one is counts "rounds"  and  is
2524       incremented by 1 at each game round.
2525
2526       *  srvtime.c / srvtime.h: code used to handle time on the server, where
2527          Allegro's functions are not available.
2528
2529       *  ticker.c / ticker.h: sets up a timer callback.
2530
2531       *  time.c / time.h: functions to know how long the game has  been  run‐
2532          ning, knowing that it can be interrupted.
2533
2534
2535
2536       In-game utilities
2537
2538       These  are  various utilities use to monitor and control the game while
2539       one's playing.
2540
2541       *  capture.c / capture.h: code used to capture the video output of  the
2542          game and store it in .bmp files while playing.
2543
2544       *  checksum.c  /  checksum.h:  utilities  to generate a checksum from a
2545          given game state. Used in network code to make sure all the  clients
2546          stay synchronized.
2547
2548       *  code.c  /  code.h: This file contains the code to handle key presses
2549          during the game. That's to say the pause key for instance.
2550
2551       *  profile.c / profile.h: provides tools to calculate how fast the game
2552          is runnning and what operations slow it down.
2553
2554       *  watchdog.c  / watchdog.h: this module waits for "secret codes" to be
2555          typed while the game is running, and traps them.
2556
2557
2558
2559       Command line handling
2560
2561       OK, now to all the UNIX guys, I *know* there are many ways to do things
2562       in  a  better and simple way than I did. But keep in mind that in 1998,
2563       under DOS, I had a rotten command line and even now I  need  everything
2564       to work on both UNIX and Microsoft platforms.
2565
2566       These utilities are not perfect, but they work, that's all I ask them.
2567
2568       *  basicopt.c  / basicopt.h: handles basic command line parameters such
2569          as "-v" or "-h".
2570
2571       *  parser.c / parser.h: contains code to parse and analyze the  command
2572          line parameters.
2573
2574       *  startup.c  /  startup.h:  analyzes  the  command line parameters and
2575          stores them into global variables.
2576
2577
2578
2579       Locale support
2580
2581       Liquid War now has locale support. Basically, all the labels and  texts
2582       in the UI are stored in constants. There's simply file per language.
2583
2584       Note  to  translators:  if you decide to translate the menus in another
2585       language, keep in mind that all the translations must fit in the  vari‐
2586       ous  buttons  and textboxes. The best resolution to test this - the one
2587       where letters take most place - is 640x480.
2588
2589       *  lang.c / lang.h: contains code to handle language dependant stuff.
2590
2591       *  langen.c / langen.h: contains code to handle English specific stuff.
2592
2593       *  langfr.c / langfr.h: contains code to handle French specific stuff.
2594
2595
2596
2597       Log and various messages
2598
2599       OK, the API of the log routines is a piece of crap. Now I'm simply  too
2600       lazy to change it. It works, that's all I ask.
2601
2602       BTW,  there's  a  clear  advantage  in  using custom-made log functions
2603       instead of plain calls to "fprintf(stderr,...". It might not be obvious
2604       for  UNIX  users,  but  think  about  Windows. Nothing like a "tail -f"
2605       there, nor a proper output redirection system. When a  user  clicks  on
2606       the  Liquid  War  icon,  I want "console" information to be logged in a
2607       file!
2608
2609       *  log.h: common header for logcli.c and logsrv.c.
2610
2611       *  logcli.c: contains code to display messages  on  the  console.  It's
2612          usefull  for  console may have different behaviors when the games is
2613          used on different platforms.  This  file  is  used  to  compile  the
2614          client.
2615
2616       *  logsrv.c:  contains  code  to  display messages on the console. This
2617          file is used to compile the server, which does not  use  Allegro  at
2618          all.
2619
2620       *  popupgen.h: common header for popup functions.
2621
2622       *  popupw32.c: code to handle popup on the Win32 platform. Popups are a
2623          must-have under Windows for error  diagnostics,  since  the  average
2624          Windows user never gives any look at any log file...
2625
2626
2627
2628       Macros, utilities and string support
2629
2630       As usual, I needed to prepare a small set of usefull macros.
2631
2632       *  macro.h: contains basic wrappers/macros for snprintf like functions.
2633          This mostly to ease up string manipulation which is - as always -  a
2634          nightmare in standard C.
2635
2636       *  path.c  /  path.h:  code  used  to  handle  filenames and paths, for
2637          instance remove path and file extension from a filename.
2638
2639
2640       It's also important to note that Liquid War uses  snprintf  instead  of
2641       sprintf, for using the latter is very likely to cause buffer overflows.
2642       Under Linux glibc provides this function but Microsoft does not provide
2643       it  natively on Windows. Therefore I used a third party snprintf imple‐
2644       mentation by Mark  Martinec:  http://www.ijs.si/software/snprintf/  and
2645       its  source  is available in the ./utils directory of Liquid War source
2646       distribution.
2647
2648
2649       Byte order and endianess
2650
2651       As you might know, PC Intel based computers are  "little-endian"  while
2652       Sun Sparc stations and Mac computers are "big-endian". This is an issue
2653       for LW since in network games maps are transmitted  in  binary  format.
2654       Therefore I needed to set up some (un)serialization fonctions.
2655
2656       *  serial.c / serial.h: code used to transform integers and map headers
2657          into an uniform cross-platform byte stream which is readable by both
2658          little and big endian machines.
2659
2660
2661
2662       Thread support
2663
2664       Liquid  War does have thread support, but it is a "limited" thread sup‐
2665       port. I mean that the game is generally monothreaded, but a  few  func‐
2666       tions  use  threads.  For  instance,  calls to the meta-server are done
2667       within threads.
2668
2669       Basically, I do not really enjoy programming in a  multithreaded  envi‐
2670       ronnement.  So  when  possible,  I  chose the monothread path, and used
2671       threads only where I simply would not be able to find  another  accept‐
2672       able solution.
2673
2674       I also needed to use some mutexes to prevent crashes in the user inter‐
2675       face.
2676
2677       *  mutxdos.c: provides fake mutex support under  DOS.  This  module  is
2678          here only to make compilation easier.
2679
2680       *  mutxgen.h: header for mutxdos.c, mutxunix.c and mutxw32.c.
2681
2682       *  mutxunix.c: provides mutex support on UNIX.
2683
2684       *  mutxw32.c: provides mutex support on Win32.
2685
2686       *  thrddos.c:  provides  fake  thread support under DOS. This module is
2687          here only to make compilation easier.
2688
2689       *  thrdgen.h: header for thrddos.c, thrdunix.c and thrdw32.c.
2690
2691       *  thrdunix.c: provides thread support on UNIX.
2692
2693       *  thrdw32.c: provides thread support on Win32.
2694
2695
2696
2697       Launching external programs
2698
2699       Liquid War might sometimes launch external programs. This is (for secu‐
2700       rity reason) not a default behavior and has to be activated and config‐
2701       ured by yourself, using the "-callback"  command  line  option  on  the
2702       server for instance.
2703
2704       *  execgen.h: header for execunix.c and execw32.c.
2705
2706       *  execunix.c: code to launch external programs on UNIX.
2707
2708       *  execw32.c: code to launch external programs on Win32.
2709
2710       *  exec2.c: code to launch external programs within the client, without
2711          any interaction with the user, ie no  unwanted  popping  window  for
2712          instance.
2713
2714
2715
2716       Low-level network code
2717
2718       There  are network packages for Allegro, but I decided not to use them.
2719       Socket support is not that hard to implement under UNIX and  Win32  and
2720       besides, I've done it for my job recently, so I just knew how to do it.
2721
2722       Another  reason  which  decided me to code my own toolbox is that I did
2723       not want Liquid War to have external dependencies - except  Allegro  of
2724       course.  This  way, UNIX gamers to not have to set up and/or download a
2725       specific network library. It's also easier to  integrate  the  game  in
2726       projects like Debian if it has few dependencies.
2727
2728       This network code is not a masterpiece, it's just a little set of tools
2729       that have proven to work. That's all.
2730
2731       BTW, it's important to notice that  when  linking  with  Allegro,  most
2732       blocking UNIX calls ("sleep" or "recv" for instance) stop working: they
2733       alwasys return immediately. This led me to implement weird ugly  hacks,
2734       like  calling  "recv"  in a loop until it gets what it wants... This is
2735       theorically and practically a performance killer, but I found no  other
2736       way  to  fix  this. And FYI, this is not an Allegro bug, it's a feature
2737       8-)
2738
2739       *  dnsutil.c / dnsutil.h: wrapper code to issue DNS  requests,  without
2740          having to handle the hostent struct.
2741
2742       *  sock2cli.c:  sode  used  to  wrap  low-level network function on the
2743          client.
2744
2745       *  sock2gen.h: header for sock2cli.c and sock2srv.c.
2746
2747       *  sock2srv.c: code used to wrap  low-level  network  function  on  the
2748          server.
2749
2750       *  sockdos.c: network API for DOS.
2751
2752       *  sockex.c: netowrk routines shared by sockunix and sockw32.
2753
2754       *  sockgen.h: header for sockdos.c, sockunix.c and sockw32.c.
2755
2756       *  sockunix.c: network API for UNIX.
2757
2758       *  sockw32.c: network API for Win32.
2759
2760
2761
2762       High-level network code
2763
2764       These files contains network utilities which are Liquid War specific.
2765
2766       *  chat.c  /  chat.h: functions used to handle chat messages in network
2767          games.
2768
2769       *  keyexch.c / keyexch.h: functions to send and  receive  keys  to  the
2770          server. Used on the client.
2771
2772       *  netconf.c  /  netconf.h:  code to send and receive the config of the
2773          clients over the network.
2774
2775       *  netkey.c / netkey.h: contains some tools to manipulate  key  strokes
2776          over the network.
2777
2778       *  netmap.c / netmap.h: code to send and receive the maps over the net‐
2779          work.
2780
2781       *  netmess.c / netmess.h: contains a parser  to  interpret  plain  text
2782          messages. Used when exhanging information over the network.
2783
2784       *  netplay.c / netplay.h: contains the code to set up and start network
2785          games.
2786
2787       *  network.c / network.h: contains some network related  functions  and
2788          constants used on the client.
2789
2790       *  ping.c  /  ping.h:  code  used on the client to estimate the average
2791          ping time with a server.
2792
2793       *  protocol.c / protocol.h: contains the sequence of messages send  and
2794          recevied by the client when connecting on the server.
2795
2796       *  startinf.c  /  startinf.h:  contains struct and tools to handle some
2797          network informations while starting a network game.
2798
2799
2800
2801       Communication with the meta-server
2802
2803       The meta-server is called by both client  and  server.  Basically,  the
2804       server registers itself, and the client asks for a list of servers.
2805
2806       The  meta-server itself is just a set of simple PHP scripts with a sim‐
2807       ple MySQL database. I chose PHP because my provider allows execution of
2808       PHP pages, that's all.
2809
2810       The  protocol  is *very* basic, and uses HTTP 1.0 for requests. Answers
2811       are received in plain text, with one information per line.  There's  no
2812       garantee  that  this  would  work  with any HTTP server, but experience
2813       proved that it works with my provider 8-)
2814
2815       *  httputil.c  /  httputil.h:  low  level  functions  to  handle   http
2816          requests.
2817
2818       *  wwwcli.c / wwwcli.h: code used on the client to communicate with the
2819          meta-server.
2820
2821       *  wwwsrv.c / wwwsrv.h: code used on the server to communicate with the
2822          meta-server.
2823
2824
2825
2826       Server code
2827
2828       The Liquid War server is a rather small program. The only thing it does
2829       is accept new players, transmit map and game parameters  between  them,
2830       and then "replicate keys".
2831
2832       By  "replicate  keys" I mean that the server asks each client what keys
2833       have been pressed during the  last  round,  and  then  dispatches  this
2834       informations  to  all  clients.  This implies that the server has abso‐
2835       lutely no idea of who's loosing, who's winning, etc...
2836
2837       All the "logic" of the server is coded in these files, the rest is only
2838       utilities and helper functions.
2839
2840       *  server.c  / server.h: main code for the server (equivalent of main.c
2841          for the client).
2842
2843       *  srvchan.c / srvchan.h: code used to handles channels on the  server.
2844          A  channel  is associated to a given computer and may manage several
2845          teams.
2846
2847       *  srvcont.c / srvcont.h: global network controler used on the server.
2848
2849       *  srvteam.c / srvteam.h: code used to handle teams on the server.
2850
2851
2852
2853

Bugs

2855   Report a new bug
2856       If you have troubles with Liquid War 5, if you think it is a  bug,  and
2857       if  it  is  not  described  in this file, then just send a (precise...)
2858       decription of your problem to the Liquid War user mailing list.
2859
2860       Besides, it happens that now most bug  reports  come  from  the  Debian
2861       tracking  system "http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=liq
2862       uidwar". Thanks to the Debian users and maintainers, it's a very  valu‐
2863       able feedback source.
2864
2865       Additionnaly,   on   online  bug  tracking  system  is  availalable  on
2866       "https://github.com/ufoot/liquidwar5/issues". I try to  collect  every‐
2867       thing  here  : bugs reported on the mailing-list, bugs from Debian, and
2868       bugs I found myself. Alternatively you can report bugs directly  on  it
2869       8-)
2870
2871
2872   Network
2873       Network support in Liquid War is far from being perfect, so there are a
2874       bunch of little problems which can appear. Basically, once the game  is
2875       correctly  started  on  a LAN, you should have no problems, but getting
2876       the game started might be difficult.
2877
2878
2879   Mouse does not work
2880       Some users reported that they were unable to  control  the  Liquid  War
2881       cursor with the mouse. Well, the answer is a typical Microsoftish "this
2882       ain't a bug, it's a feature!".
2883
2884       More seriously, you're supposed to move the cursor with the keyboard in
2885       Liquid  War. There's no way to handle the cursor "like a mouse pointer"
2886       (*). This is due to:
2887
2888       *  Severe limitations in the Liquid War core algorithm.
2889
2890       *  The fact that moving the cursor "too fast" would really  change  the
2891          gameplay of Liquid War. As a Liquid War integrist 8-) I can tell you
2892          the game would really not be the same if you could move  the  cursor
2893          as  fast  as you wish. It's part of the game that sometimes it takes
2894          you ages to recover from a strategical mistakes. You need  to  think
2895          twice  before  going to the very end of a level. That's strategy. At
2896          least that's how I view things...  Anyways  as  I  mentionned  above
2897          there's a limitation in the core algorithm.
2898
2899
2900       (*)  This  is  not  perfectly true, there's a way to control the cursor
2901       with the mouse, but it's designed for the case "4 people want  to  play
2902       on  the  same computer and one single keyboard is not enough". Control‐
2903       ling the cursor with the mouse in Liquid War is possible but yet rather
2904       hard  to master 8-/ Try it and you'll understand what I mean. This mode
2905       can be set up in the "Teams" menu.
2906
2907
2908   Game does not start
2909       On non UNIX platforms such as Windows or DOS, Liquid War is distributed
2910       in  a  .zip  file. It's IMPORTANT that you unzip the .zip files with an
2911       "unzipper" which preserves the directory structure. Most install  prob‐
2912       lems  under  Windows  come from broken unzipping programs which extract
2913       all files in the same directory... WinZip 8.x or the unzip32.exe  util‐
2914       ity  that  comes with DJGPP are both able to uncompress Liquid War .zip
2915       files correctly.
2916
2917       On Liquid War 5.5.9 and later, the Windows version should  detect  this
2918       problem  automatically and warn you with a message which basically says
2919       something like "Unable to load datafile. Are you  sure  Liquid  War  is
2920       correctly  installed?".  If you get this message, you need to reinstall
2921       the game by unzipping it with a "correct" unzipping program which  does
2922       not wreck directory structrure up.
2923
2924
2925   Datafile bugs
2926       Sometimes  there  are  some  problems when compiling the datafile, this
2927       includes:
2928
2929       *  The liquidwarcol,  liquidwarmap  and  liquidwartex  utilities  might
2930          freeze or segfault. Typing "make" again often solves the problem.
2931
2932       *  The  background  image  sometimes  ends  up using the wrong palette,
2933          which has a very nasty consequence: it looks ugly.
2934
2935
2936       These bugs are quite hard to get rid off, since  I  can  not  reproduce
2937       them  easily. The good solution would be to completely rewrite the liq‐
2938       uidwarcol, liquidwarmap and liquidwartex utilities.
2939
2940
2941   Midi does not work on OSS
2942       Preamble
2943
2944       IF your midi music on Liquid War, or indeed  any  other  Allegro  game,
2945       doesn't  work  and  you  are  using the OSS (Open Sound System) drivers
2946       (these are the sound drivers which come with the standard  kernel  dis‐
2947       tribution),  this may well be because Allegro only supports "FM synthe‐
2948       sis" and not "wavetable" when it is using OSS. FM synthesis is  a  very
2949       old  method  of making sound from MIDI and has long since been replaced
2950       by wavetable synthesis, with the net result that  it's  quite  possible
2951       you've got OSS MIDI working nicely in other applications without having
2952       FM support set up at all. This is what I found. (It has to be said that
2953       I  didn't  find  the FM sound quality quite as bad as people have said,
2954       though).
2955
2956       In this situation, it looks to me like you have the following choices:
2957
2958
2959       Hack Allegro...
2960
2961
2962
2963       and for the rest of us...
2964
2965
2966       Use Allegro's DIGMID midi driver...
2967
2968
2969
2970
2971       Get an FM driver up and running...
2972
2973
2974
2975       *  Find out which FM driver is appropriate for your sound card. If  you
2976          have  distribution-specific tools and docs for setting up sound, try
2977          those. If not, you will need to be familiar with  the  knowledge  in
2978          the  Sound-HOWTO  and  Kernel-HOWTO i.e. know how to compile kernels
2979          and modules and deal with sound drivers.
2980
2981       *  Look through the OSS modules in 'make menuconfig' and  see  if  any‐
2982          thing  catches  your eye. See if there is any specific documentation
2983          on  your  sound  card  on  http://www.linuxdoc.org.  Do  a  few  web
2984          searches. For my AWE64, I use the OPL3 driver.
2985
2986       *  Compile  and  install the FM driver module, or set up your system to
2987          use the new kernel if you want to compile the driver in.
2988
2989       *  Load the module, or boot your new kernel. It is very important  that
2990          you  pay  attention to what is said in the 'help' for your FM driver
2991          in 'make menuconfig' and read any necessary files in the  Documenta‐
2992          tion/sound/ directory. For example, I just had a nice half-hour won‐
2993          dering why the hell my FM wasn't working now when it had been before
2994          - with the OPL3 driver, you have to give the option io=0x388 to ins‐
2995          mod. Which is stated nice and clear in the docs, but of course I had
2996          forgotten  since  then. You can prevent such happenings by recording
2997          options permanently in /etc/modules.conf - see the manpage etc.
2998
2999       *  Try the game. If it's worked you will hear particularly beepy music.
3000          Enjoy!
3001
3002
3003
3004       Opl3 occult FAQ
3005
3006       --IMPORTANT--  If  you  are using Liquid War, your FM will only work if
3007       you go to the map 'Elephant inside a boa' and  proceed  to  chase  each
3008       other round in circles for at least 10 minutes. This cures a bug in the
3009       design of the OPL3 interface which conflicts badly with the core Liquid
3010       War  algorithms.  How  the hell the music hardware even knows about the
3011       core algorithms I don't know, but that's what I made of the now-defunct
3012       opl3-occult-FAQ, from which here is an excerpt:
3013
3014       Many  roads  a  man must take. Those with one-track minds are DOOMED, I
3015       tells ya.
3016
3017       ---- The Liquid War algorithm calculates distances to  one  place,  the
3018       cursor.
3019
3020       And:
3021
3022       Man  or  machine,  face  or code, must stand strong and solid; must not
3023       just ooze away as slime.
3024
3025       ---- We think it might just take objection to the whole 'slimy'  nature
3026       of the LW beings. As well as it being LIQUID War.
3027
3028       So,  our  carefully  tailored  approach, is to firstly have the players
3029       going in all the possible different directions evenly by moving  around
3030       the  map  in  circles, and secondly to divert the opl3's attention from
3031       the general slimy liquidness of it all  by  emphasizing  the  solidity,
3032       reality,  and  natural  goodness  of that classic tapestry: an elephant
3033       inside a boa.
3034
3035       That and it's a f***ing ace level.
3036
3037
3038
3039   Checksum errors
3040       The Liquid War server is a "light" servers which - to some extent - has
3041       no  idea  about  what is going on in the game. It simply replicates key
3042       strokes between clients and each client maintains its own  game  state.
3043       Normally,  the  game  is designed so that given the same user input, it
3044       will behave exactly the same.
3045
3046       However, it happens that sometimes 2 clients  can  behave  differently,
3047       and  this is a (severe) bug. One consequence is that messages reporting
3048       "Checksum errors" appear on the server's and on  the  client's  console
3049       output.  This  bug appears when using non-default rules settings. Basi‐
3050       cally, if someones tweaks his rules, then the checksum  errors  appear.
3051       Of  course  I double-triple checked that options were correctly sent on
3052       the network, but, well, could not fix the  bug.  Yet.  The  short  term
3053       solution seems to play with default factory settings...
3054
3055       I'm highly interested in bug-reports concerning this problem.
3056
3057

To do

3059   Bug-fixing
3060       In  its  latest releases Liquid War is quite stable IMHO. However there
3061       are still some issues with network  under  Windows  for  instance.  I'm
3062       aware  of  these  bugs  and I'm trying to fix them but this does really
3063       take time.
3064
3065       I always welcome bug-reports and patches, as making Liquid War W  5.x.x
3066       as stable and bug-free as possible is really important to me - and most
3067       of the time players also appreciate stable programs 8-)
3068
3069       The most important bug-fixing area is probably cross-platform  support.
3070       That  is,  make sure that the game runs fine on every supported OS. For
3071       instance, it's quite common  for  Mac  OS/X  and/or  FreeBSD  users  to
3072       "crash" the game. This rarely happens on GNU/Linux, just because it has
3073       been so much more tested on this platform. This applies to  Liquid  War
3074       itself and also, to some extent, to Allegro.
3075
3076
3077   New features
3078       Let's  be clear: no new features in Liquid War 5. It's bloated, compli‐
3079       cated, old, uninteresting to hack. All new features should be found  in
3080       Liquid War 6.
3081
3082
3083   Liquid War 6
3084       Since  summer  2005, Liquid War 6, a complete rewrite of Liquid War, is
3085       on   its   way.    See    http://www.gnu.org/software/liquidwar6/    or
3086       "https://ufoot.org/liquidwar/v6" for more informations.
3087
3088

Work in progress

3090   Note on releases
3091       Whenever Liquid War is released, I usually pass the good news to Fresh‐
3092       meat ( http://freshmeat.net/projects/liquidwar/ ).  Then  all  releases
3093       are    accessible    from    the   main   download   page,   which   is
3094       "https://ufoot.org/liquidwar/v5/download".
3095
3096       Releasing the game takes time, for I want all binaries to install prop‐
3097       erly  and  sources  to  compile  cleanly. Therefore there might be some
3098       delay before the time coding is over and the time a release is actually
3099       ready.  So  for  impatients  and/or for people who need to test out the
3100       very latest versions (eg someone who wants to compile the game on a new
3101       platform), it's possible to access the source repository directly.
3102
3103
3104   About GIT
3105       Historically, Liquid War has used CVS, GNU Arch (aka tla), and now uses
3106       git http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html.
3107
3108       So FYI the previously active CVS and GNU Arch repositories, on  Source‐
3109       forge and Savannah, are currently unmaintained. It has moved to Github.
3110
3111
3112   How to get latest releases
3113       A typical git command would be:
3114
3115       git clone https://github.com/ufoot/liquidwar5.git
3116
3117       If  you  are interested, I can open this repository in read/write mode,
3118       however one of the points of git is that it is distributed  and  allows
3119       cooperative  developpement  with  multiple depots, so this isn't manda‐
3120       tory. And anyways, importing myself patches received by email has never
3121       been a real burden.
3122
3123       Besides,   most  developpement  is  now  done  on  Liquid  War  6.  See
3124       http://www.gnu.org/software/liquidwar6/  or  "https://ufoot.org/liquid
3125       war/v6" for more informations.
3126
3127

Copying

3129       Liquid War is a multiplayer wargame.
3130
3131       Copyright (C) 1998-2018 Christian Mauduit (ufoot@ufoot.org)
3132
3133       This program is free software; you can redistribute it and/or modify it
3134       under the terms of the GNU General Public License as published  by  the
3135       Free  Software Foundation; either version 2 of the License, or (at your
3136       option) any later version.
3137
3138       This program is distributed in the hope that it  will  be  useful,  but
3139       WITHOUT  ANY  WARRANTY;  without  even  the  implied  warranty  of MER‐
3140       CHANTABILITY or FITNESS FOR A partICULAR PURPOSE. See the  GNU  General
3141       Public License for more details.
3142
3143       You should have received a copy of the GNU General Public License along
3144       with this program; if not, write to the Free Software Foundation, Inc.,
3145       51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
3146

AUTHOR

3148       Christian Mauduit <ufoot@ufoot.org>
3149
3150
3151
3152
3153                                    v5.6.5                       Liquid War(6)
Impressum