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-doc-5.6.3 directory (from the
31       liquidwar-doc package), for this is where HTML and other  documentation
32       files  should  be.  Otherwise, if you are a die-hard man page user, you
33       may continue 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 Samohýl.
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: http://www.ufoot.org
176
177       GnuPG public key: FD409E94 - http://www.ufoot.org/gnupg.pub
178       GnuPG fingerprint: 4762 1EBA 5FA3 E62F 299C  B0BB DE3F 2BCD FD40 9E94
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
244       Many  other people helped me by submitting bug reports and patches, and
245       I want to thank them for their precious help. Thanks to all the  Debian
246       people too, who nicely maintain the Liquid War .deb package.
247
248

Mailing lists

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

Fanfic

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

Network game

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

Command line parameters

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

Platform specific issues

1603   General remarks
1604       Liquid  War is now a cross-platform game, thanks to Allegro. So now you
1605       can play under different OS.
1606
1607       The same source tree will compile on all supported platforms, but  with
1608       slight  differences  when  running. C preprocessor #defines are used to
1609       code some platform specific stuff, and in some cases there are  differ‐
1610       ent files for the DOS, Windows and UNIX versions.
1611
1612       As I said, I try to use the same code for all platforms. This is in the
1613       long term the best choice. Otherwise there would different branches  of
1614       the source tree, and I don't think this is a very good solution.
1615
1616       Therefore  some  optimizations  that were performed in the old DOS-only
1617       version have been totally removed, for they were 100%  platform  depen‐
1618       dent  (ie  mode-X  asm  coding).  So  the new versions are all a little
1619       slower than the old 5.1 stuff, but the performance loss is  only  about
1620       20%, which is not significant with today's PCs. And anyways the perfor‐
1621       mance loss is most of the time limited to the goog  old  VGA  320x200x8
1622       mode-X, which starts being kind of obsolete.
1623
1624
1625   DOS
1626       This  is  the  original version. It's the fastest one as far as I know,
1627       the safest one and it will always be I think, since Allegro  was  first
1628       designed  for  DOS,  and DOS allows a full unconditionnal access to all
1629       the hardware ressources LW requires. LW doesn't use any hardware accel‐
1630       eration  and  it's not been designed to do so. Unfortunately there's no
1631       network support for the DOS version of Liquid War.
1632
1633
1634   Windows
1635       When running under a Windows box, the DOS release used to be safer than
1636       the  native  Windows  port. Now that DOS support is getting really poor
1637       with recent versions of Windows, the native Windows release  of  Liquid
1638       War  starts  begin  the  good choice for Windows users. And Allegro for
1639       Windows is getting quite stable in the 4.x series.
1640
1641       The other reason to choose this release rather than the DOS release  is
1642       that it has network support.
1643
1644       If you have problems running Liquid War under Windows, please check out
1645       the "data\lwwin.log" file which should be written each time you run the
1646       game.  It  contains  the  information which is displayed on the console
1647       under other platforms, and might give you a  clue  about  what's  going
1648       wrong.
1649
1650
1651   GNU/Linux
1652       This port is the most recent one, and also the one I prefer. Paths have
1653       been changed to an UNIXish style, ie the data is stored in:
1654
1655       /usr/local/share/games/liquidwar
1656
1657       the executable in:
1658
1659       /usr/local/games
1660
1661       and the configuration file is
1662
1663       ~/.liquidwarrc
1664
1665       Since not all GNU/Linux distributions have  /usr/local/games  in  their
1666       path,  I  also put a symbolic link to the binaries in /usr/local/bin. I
1667       believe Liquid War is quite FHS compliant, so if its  default  directo‐
1668       ries do not match your configuration, blame your distro for not follow‐
1669       ing  the  standards  8-)   AFAIK   the   only   touchy   directory   is
1670       /usr/local/share/pixmaps  which I've seen on many distribution but does
1671       not seem to be referenced in the FHS.
1672
1673       With the latest releases of Allegro, Liquid War is becoming pretty sta‐
1674       ble  under  GNU/Linux.  You should also know that the GNU/Linux port is
1675       usually the most up to date, since I very very seldom boot  Windows  at
1676       home and do most of the coding under GNU/Linux.
1677
1678
1679   FreeBSD
1680       This  is  the  latest  port,  so  I  expect it to be a little touchy to
1681       install and/or run for some time.
1682
1683       Note that to compile the game you'll need to  install  GNU  tools  like
1684       gmake  and  gcc.  Liquid War won't compile with the genuine make and cc
1685       commands.
1686
1687       One thing you might ask is: "why do you provide the binary as  a  plain
1688       .tgz  file,  it would be much nicer if a standard FreeBSD port was pro‐
1689       vided instead!". The answer is that the statically linked binary should
1690       work flawlessly and does not raise any dependency problem. Also I don't
1691       know how to make a BSD port and I'm not really interested in doing  it.
1692       If  it's  easy to do, then someone can simply do it and send it back to
1693       me. If it's hard to do, then I do not really have the time nor  motiva‐
1694       tion  to do it. What I did is make the code and install scripts FreeBSD
1695       friendly so that it would be possible to compile the game  under  Free‐
1696       BSD. Packaging is another story.
1697
1698
1699   Mac OS X
1700       There's  currently  a  beta  version of a Mac OS X port for Liquid War.
1701       Ryan D. Brown nicely managed to compile and run the game under  Mac  OS
1702       X,  and  the  latest  news was that it does basically work. Still, this
1703       port did not go through intensive testing, so there might still be some
1704       bugs, expecially concerning networking.
1705
1706       There  were  some  byte  endianess  problems  in  previous  ( <=5.5.8 )
1707       releases of LW, but I tried to fix them and they should be gone now.
1708
1709       As of today, we're trying to find out a convenient way to  package  and
1710       release  the  Mac OS X version of LW. You can contact us on the mailing
1711       list if you're interested in this port.
1712
1713

User levels

1715   A piece of advice
1716       You can use your own levels whith Liquid War 5. The only thing you have
1717       to  do  is to put your own 256-colors vbitmap files in a special direc‐
1718       tory, and the program will use them. Currently, BMP, LBM, PCX, and  TGA
1719       files  are supported. It is a good thing to use 256 colors bitmaps, for
1720       they waste less disk space than truecolor bitmaps,  and  Liquid  War  5
1721       converts  all  bitmaps  to  32 colors bitmaps. Additionnally, truecolor
1722       bitmaps might cause the DOS version to crash randomly...  2-color  bit‐
1723       maps will also cause the program to crash. I warned you!
1724
1725       The  best thing you can do to create your user levels is to have a look
1726       at the few user files I put in the .zip file and try  at  first  to  do
1727       something that looks about the same!
1728
1729
1730   Maps
1731       Liquid  War  5  does  many checks on user levels and is much safer than
1732       Liquid War 3. Still, try and help the program not to crash,  if  possi‐
1733       ble.
1734
1735       Liquid  War  considers that dark colors are walls and bright colors are
1736       associated to the playable area. So you can draw your walls  in  black,
1737       dark  blue,  etc...  And the rest of the map can be of any bright color
1738       such as white or yellow.
1739
1740       You can draw a small map on a big bitmap, as long as you use  a  bright
1741       background  color. Liquid War will autodetect the range of your map and
1742       add the border line if necessary.
1743
1744       Liquid War re-orders all the maps, so that the smallest ones are on the
1745       left  and  the  most complicated ones on the right when you choose them
1746       with the slider in the "map" menu. So if you can't  find  the  map  you
1747       just  draw, don't worry, it is probably just mixed with the levels from
1748       the .dat file.
1749
1750       The  default  path  for  maps  is   "custom\map\"   on   windows,   and
1751       "/usr/local/share/games/liquidwar/map" on GNU/Linux.
1752
1753
1754   Textures
1755       All  you  have  to do is put a bitmap in the default directory which is
1756       "custom\texture\"  on  windows,   and   "/usr/local/share/games/liquid‐
1757       war/texture" on GNU/Linux.
1758
1759
1760   Textures
1761       As  of  Liquid  War 5.6.x, it's possible to associate a map with a tex‐
1762       ture. All you need is to call the maps with  the  same  name  (case  is
1763       important,  lowercase  recommendend...).  Look at the "meditate" custom
1764       map which is shipped with Liquid War for instance.
1765
1766       This also works  with  internal  builtin  maps  (those  stored  in  the
1767       datafile)  so for instance if you name a custom texture "world1.bmp" it
1768       will automatically be associated to the builtin map world1  (to  figure
1769       out  internal names you have to unpack the source distribution and look
1770       in the ./data directory). This also works the other way, if you name  a
1771       map  "wood2.bmp"  it  will be automatically associated with the builtin
1772       texture wood2.
1773
1774       Associating a texture with a map requires more work  than  designing  a
1775       simple  map,  but  the results is usually much nicer. See the "Kasper -
1776       ..." series of maps for instance.
1777
1778
1779   Send your levels
1780       Maybe you will find that the original levels are ugly  and  unplayable.
1781       Well,  if you have made user levels and think they are great, just send
1782       them to the Liquid War user mailing list. Please use  only  256  colors
1783       bitmap  and zip them before sending them, or else they might be blocked
1784       by my provider...
1785
1786       As of today, dozens of user maps have already been included  in  Liquid
1787       War,  this  is very nice for it happens that every map designer has his
1788       own personnal tastes, so the maps all look different.
1789
1790       Still, to be included in Liquid  War's  mainstream  distribution,  your
1791       maps  will  need to be placed under the terms of the GNU General Public
1792       License, or at least a compatible license. You should have  received  a
1793       copy of this license with Liquid War anyway. Read it 8-)
1794
1795       Of course, you can use *any* map when playing. You can even play with a
1796       bitmap you got from a proprietary source - such a proprietary game  you
1797       bought  for  instance  -  but the point is that I can't - and you can't
1798       either - distribute such a map along with Liquid War.
1799
1800       However, this is enough legal boring stuff! What  you  should  keep  in
1801       mind  is  that  I'm  always happy when I receive maps from players, and
1802       it's a pleasure for me to include them in the mainstream distribution.
1803
1804

Core algorithm

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

Source code

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

Bugs

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

To do

3019   Bug-fixing
3020       In its latest releases Liquid War is quite stable IMHO.  However  there
3021       are  still  some  issues  with  network under Windows for instance. I'm
3022       aware of these bugs and I'm trying to fix them  but  this  does  really
3023       take time.
3024
3025       I  always welcome bug-reports and patches, as making Liquid War W 5.x.x
3026       as stable and bug-free as possible is really important to me - and most
3027       of the time players also appreciate stable programs 8-)
3028
3029
3030   Artwork
3031       It's  hard  to find people to do that kind of thing. Artists are indeed
3032       pretty rare, at least artists who wish to create stuff freely... So  if
3033       you  feel  like  adding  some  theme  support to Liquid War, this could
3034       *really* help. I used the textures I had but it would be  nice  if  one
3035       could  have  a  "space"  ambiance,  an  "ocean"  ambiance or a "desert"
3036       ambiance. This could really make the game better I think.
3037
3038       Musics (in midi format) are  also  appreciated.  Tim  Chadburn  sponta‐
3039       neously contributed the first midi files, and it really pleased me 8-)
3040
3041
3042   New features
3043       I  regularly receive requests for new features in Liquid War. Of course
3044       I do not have enough time to implement them all, so  they  land  in  my
3045       "todo"  list. However, most "major" evolutions are now planned for Liq‐
3046       uid War 6, since the code in Liquid War 5 is bloated as hell. It's  all
3047       right to debug it and code minor evolutions, but that's all.
3048
3049       However,  here's a list of what "could be" in the next Liquid War 5.x.x
3050       releases, although it might never be implemented there and  come  later
3051       with Liquid War 6:
3052
3053       *  Network  enhancements.  Network in LW5 is somewhat buggy and hard to
3054          use, improvements wouldn't harm.
3055
3056       *  Theme support. This would be a way to get rid of  the  ugly  current
3057          fonts and menus.
3058
3059
3060
3061   Liquid War 6
3062       Since  summer  2005, Liquid War 6, a complete rewrite of Liquid War, is
3063       on its  way.  See  http://www.ufoot.org/liquidwar/liquidwar6  for  more
3064       informations.
3065
3066

Work in progress

3068   Note on releases
3069       Whenever Liquid War is released, I usually pass the good news to Fresh‐
3070       meat ( http://freshmeat.net/projects/liquidwar/ ).  Then  all  releases
3071       are    accessible    from    the   main   download   page,   which   is
3072       http://www.ufoot.org/liquidwar/download.
3073
3074       Releasing the game takes time, for I want all binaries to install prop‐
3075       erly  and  sources  to  compile  cleanly. Therefore there might be some
3076       delay before the time coding is over and the time a release is actually
3077       ready.  So  for  impatients  and/or for people who need to test out the
3078       very latest versions (eg someone who wants to compile the game on a new
3079       platform), it's possible to access the source repository directly.
3080
3081
3082   About GNU Arch
3083       I  use  GNU  Arch  (Tom  Lord's  Arch in fact, http://www.gnu.org/soft
3084       ware/gnu-arch/ ) instead of the previously used CVS.  Indeed,  tla  has
3085       some  very  fancy  features  such  as signing patches with gpg, and I'm
3086       tired of suffering CVS limitations.
3087
3088       So FYI the previously  active  CVS  repositories,  on  Sourceforge  and
3089       Savannah, are currently unmaintained.
3090
3091
3092   How to get latest releases
3093       *  Step    1:    read   the   excellent   Arch   tutorial   http://reg
3094          exps.srparish.net/www/tutorial/html/arch.html if you are not  famil‐
3095          iar  with  tla. I admit there's a steep learning curve, but it's yet
3096          clear and understandable.
3097
3098       *  Step 2: point on my repository, which is accessible  (read-only)  on
3099          http://ufoot.hd.free.fr/depot/pub/2005-freesoftware/liquidwar/.
3100          Should this address move, try http://ufoot.hd.free.fr/depot/pub/ and
3101          browse until you find Liquid War.
3102
3103
3104       Note  that http://ufoot.hd.free.fr is a personnal web server located in
3105       my living room. It uses a simple DSL connection, so bandwidth won't  be
3106       exceptionnally high, and it may suffer long and unexpected downtimes.
3107
3108       If  you  are interested, I can open this repository in read/write mode,
3109       however one of the points of GNU Arch is  that  it  allows  cooperative
3110       developpement  with  multiple depots, so this isn't mandatory. And any‐
3111       ways, importing myself patches received by email has never been a  real
3112       burden.
3113
3114

Copying

3116       Liquid War is a multiplayer wargame.
3117
3118       Copyright (C) 1998-2005 Christian Mauduit (ufoot@ufoot.org)
3119
3120       This program is free software; you can redistribute it and/or modify it
3121       under the terms of the GNU General Public License as published  by  the
3122       Free  Software Foundation; either version 2 of the License, or (at your
3123       option) any later version.
3124
3125       This program is distributed in the hope that it  will  be  useful,  but
3126       WITHOUT  ANY  WARRANTY;  without  even  the  implied  warranty  of MER‐
3127       CHANTABILITY or FITNESS FOR A partICULAR PURPOSE. See the  GNU  General
3128       Public License for more details.
3129
3130       You should have received a copy of the GNU General Public License along
3131       with this program; if not, write to the Free Software Foundation, Inc.,
3132       59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
3133

AUTHOR

3135       Christian Mauduit <ufoot@ufoot.org>
3136
3137
3138
3139
3140                                    v5.6.3                       Liquid War(6)
Impressum