1Liquid War(6) Games Manual Liquid War(6)
2
3
4
6 liquidwar - a unique multiplayer wargame
7
9 liquidwar [-vh]
10
12 Liquid War is a multiplayer wargame. Its rules are very simple but yet
13 original.
14
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
3135 Christian Mauduit <ufoot@ufoot.org>
3136
3137
3138
3139
3140 v5.6.3 Liquid War(6)