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 or /usr/local/share/doc/liquid‐
31 war directories, for this is where HTML and other documentation files
32 should be. Otherwise, if you are a die-hard man page user, you may con‐
33 tinue with this document 8-)
34
35
37 The Liquid War concept
38 Liquid War is a wargame. But it is different from common wargames.
39
40 When playing Liquid War, one has to eat one's opponent. There can be
41 from 2 to 6 players. There are no weapons, the only thing you have to
42 do is to move a cursor in a 2-D battlefield. This cursor is followed by
43 your army, which is composed by a great many little fighters. Fighters
44 are represented by small colored squares. All the fighters who have the
45 same color belong to the same team. One very often controls several
46 thousands fighters at the same time. And when fighters from different
47 teams meet, they eat each other, it is as simple as that.
48
49
50 How do teams react?
51 Teams are composed of little fighters. These fighters all act indepen‐
52 dently, so it can happen that one single fighters does something dif‐
53 ferent from what all the other do.
54
55 The main goal of these fighters is to reach the cursor you control. And
56 to do that, they are in a way quite clever, for they choose the short‐
57 est way to reach it. Check it if you want, but it is true, they
58 *really* choose *the* shortest way to reach the cursor. That is the
59 whole point with Liquid War.
60
61 But these fighters are not perfect, so when they choose this shortest
62 way, they do as if they were alone on the battlefield. That's to say
63 that if there is a fighter blocking their way, they won't have the idea
64 to choose another way, which is free from fighters but would have been
65 longer otherwise. So fighters can be blocked.
66
67
68 Who eats whom?
69 When two fighters from different team meet each other, they first try
70 to avoid fighting, and they dodge. But if there is no way for them to
71 move, they get angry and attack the guy which is blocking them. Some‐
72 times, they attack each other and both loose health. But it can happen
73 that a fighter is attacked by another one, which is himself not
74 attacked at all.
75
76 Here is an example of this behaviour: A blue fighter and a red fighter
77 both want to move to their right, for that would be the shortest way to
78 reach their cursor if there was nobody on the battlefield. But they are
79 blocked by other fighters. If, for instance, the red fighter is on the
80 right and the blue fighter on the left, it is the red fighter which
81 will be eaten.
82
83 When a fighter is attacked, he first looses health, that is to say that
84 he gets darker. When his health reaches 0, his color changes and he
85 becomes a member of the team by which he has been attacked. Therefore
86 the number of fighters on the battlefield always remains the same.
87
88 When fighters of a same team get stuck together and block each other,
89 then they regenerate, that is to say that they get brighter.
90
91 However, I think the best way for you to understand the way it works is
92 to try the game...
93
94
95 Basic strategy
96 When I play Liquid War, I always try to surround my opponents, and it
97 usually works.
98
99 By the way, the computer has no strategy at all, he is a poor player,
100 and if you get beaten by him, it means you have to improve yourself a
101 lot!
102
103 But still, the computer doesn't do one thing which I've seen many
104 beginners doing: he never keeps his cursor motionless right in the mid‐
105 dle of his own fighters, for this is the best way to loose.
106
107
108 More strategy
109 Here are some more tips, kindly submitted by Jan Samohyl.
110
111 * Try to cut your opponent off walls and surround him completely with
112 your troops; when trying to penetrate his forces inside a tunnel,
113 keep your troops at the wall (and force them ocassionaly to attack
114 off the wall). I think this is a biggest weakness of the computer
115 AI, that it doesn't know this.
116
117 * When luring your troops to outflank an enemy, always move your cur‐
118 sor through the enemy, not the other way around.
119
120 * To penetrate very narrow tunnels, stand back for a while and let
121 some enemy troops come from the tunnel to you. Then surround them,
122 destroy, repeat.
123
124 * I have observed that with more than 2 players (6), the game diffi‐
125 culty depends on the map in the following way: If the playing field
126 is completely empty, without any holes (topologically equivalent to
127 full circle), the game is the easiest, because you can just go
128 through the middle to outflank your opponent. If there is a single
129 large obstacle (ie. playfield is topologically equivalent to ring
130 (the area between two nested circles)), the game is the most diffi‐
131 cult, because you have to choose one direction for the attack, and
132 cannot simply defend the other direction. For other maps, it seems
133 to really depend on their similarity to one of these two extreme
134 situations (and army size, of course, because it changes the rela‐
135 tive size of obstacles). Also, if you would later add another cur‐
136 sor, this property would probably disappear (maybe then games with
137 n+1 obstacles would be the hardest ones with n cursors).
138
139 * If you want a particularly challenging computer game (at least for
140 some maps), use several players, max out attack, min out defense,
141 max out base health (opposite would be harder, but game then changes
142 to the large cloud of black troops, so you don't see anything) and
143 give winner an advantage.
144
145
146
147 The winner is...
148 The clever guy who has got the greatest number of fighters in his team
149 at the end of the game. Or the one who exterminates all the other
150 teams!
151
152
154 Thom-Thom
155 Liquid War rules have been invented by Thomas Colcombet.
156
157 He was trying to find algorithms to find the shortest path from one
158 point to another, and found the Liquid War algorithm. Then it came to
159 his mind that a game could be build upon this algorithm, and Liquid War
160 was born. He programmed the first two versions of Liquid War using Bor‐
161 land Pascal for DOS, and gave me some information about the algorithm
162 so that I could re-program it.
163
164
165 U-Foot
166 I'm the guy who programmed the latest versions of Liquid War. I
167 enhanced the algorithms, and did quite a bunch of work to have the game
168 playable by (almost) anyone, that's to say create a correct GUI.
169
170 If you want to join me, here's all the information you'll ever need:
171
172 Christian Mauduit
173
174 E-mail: ufoot@ufoot.org
175 Web site: "https://ufoot.org"
176
177 GnuPG public key: CA272B47 - "https://ufoot.org/gnupg.pub"
178 GnuPG fingerprint: 71AD 4CBB 345A 5F15 6D03 AA6D 1050 9F67 CA27 2B47
179
180 Snail mail: 32 rue Jean Moulin 95100 Argenteuil FRANCE
181
182
183 Other contributors
184 As Liquid War is now free software, protected by the GPL, anyone is
185 allowed to view, edit, modify, re-compile the source code, and distrib‐
186 ute it, as long as Liquid War is still distributed under the GPL.
187
188 Here's a list of the contributors:
189
190 * Alstar: drew a map, which is now included in the main distribution.
191
192 * Peter Wang: ported Liquid War to GNU/Linux.
193
194 * Cort Danger Stratton : helped me setting up network support.
195
196 * Tim Chadburn : wrote midi files for the game. His contribution has
197 been truely appreciated since it's rather hard to find GNU GPL com‐
198 pliant artwork. He also wrote documentation and helped with midi
199 support in general.
200
201 * Jan Gretschuskin : contributed 11 maps, and made the German transla‐
202 tion. So if you run Liquid War with German menus, you know who you
203 have to thank -> Jan! 8-) Also do not forget to visit
204 http://www.game-factor.de
205
206 * Mouse : contributed a map.
207
208 * Rene Stach : drew 3 maps.
209
210 * Roderick Schertler : implemented HTTP 1.1 support.
211
212 * Ryan D. Brown : ported Liquid War to Mac OS X.
213
214 * Eduard Bloch : maintained the Debian package, and helped with German
215 support.
216
217 * Michael Terry : provided a .desktop file for better integration with
218 Gnome, KDE and other UNIX desktop environments.
219
220 * Kasper Hviid : contributed many maps, with their own textures, and
221 made the Danish translation. Great work, also available on
222 http://levels.2v1.cz/index.html
223
224 * David Redick : wrote an external random map generator, available on
225 http://xdavidx.sqrville.org/lwmapgen/index.html
226
227 * Alexandre Pineau : maintains the Debian package.
228
229 * Michael Wagner : translated the web site in German.
230
231 * Peter Williams : fixed the "too many opened socket" server bug.
232
233 * Jan Samohyl : submitted strategy tips.
234
235 * Gavin : wrote the Liquid War fanfic.
236
237 * Dave Vasilevsky : fixed the Mac OS X port.
238
239 * 2 of omega : contributed a map.
240
241 * 666-REFIZUL-666 : created many maps (distributed separately).
242
243 * Thomas Klausner : fixed Makefile for FreeBSD
244
245 * Joan Dolc : helped with Mac OS/X port
246
247 * Jan Szenborn : Polish translation.
248
249
250 Many other people helped me by submitting bug reports and patches, and
251 I want to thank them for their precious help. Thanks to all the Debian
252 people too, who nicely maintain the Liquid War .deb package.
253
254
256 liquidwar-user
257 Description
258
259 This list is for general discussions about Liquid War. Here you can
260 make suggestions, submit bug reports, ask for help, find players,
261 etc... Basically, any question or remark which concerns the game is
262 welcomed on this list.
263
264
265 Practical informations
266
267 You can't send messages to the list without subscribing. The only rea‐
268 son for this is that it's one of the only way to block spam effi‐
269 ciently. I first thought it could be OK to allow anyone to post, but
270 liquidwar-user seems to have be harvested by robots, so now I need to
271 restrict posters. However, I insist on the fact that anyone can sub‐
272 scribe, and the subscription to the list is not moderated. So if you
273 are a human being and not a stupid spam robot, you're welcome on the
274 list 8-)
275
276 Here's a list of usefull URLs:
277
278 * To (un)subscribe: http://mail.nongnu.org/mailman/listinfo/liquid‐
279 war-user
280
281 * To consult archives: http://mail.nongnu.org/pipermail/liquid‐
282 war-user/
283
284 * To post on the list: liquidwar-user@nongnu.org
285
286
287
288
289 Chat and IRC
290 Web-based chat-box
291
292 I have have set up a web-based chat-box which is accessible here:
293 "https://ufoot.org/liquidwar/v5/metaserver.php"
294
295 It's not as good as a good old IRC channel but not everybody can use
296 IRC (because of firewalls and the likes), and I like the idea that peo‐
297 ple can chat and have the list of available servers in one single web
298 page.
299
300
301 IRC channels
302
303 I personnally spend some time on irc.freenode.net so you might use it
304 to find other players - though I'm not really an IRC addict... ...not
305 yet at least!
306
307 Here are the channels I recommend:
308
309 * #liquidwar : Liquid War dedicated channel, to find players and chat
310 while playing.
311
312 * #netgame_players : general channel for players who want to play
313 Internet games - Free Software and/or Open Source games of course,
314 we're on freenode.net 8-)
315
316
317
318
320 What's this?
321 Quoting Gavin: "I wrote a liquid war fanfic some time ago [...] I wrote
322 it after a friend claimed that there wasn't any liquid war fanfic
323 because it wasn't possible."
324
325 So here it is, a Liquid War fanfic, enjoy! (and special thanks to
326 Gavin)
327
328
329 The Battle of Emberlificoted
330 ...
331
332 The General presided over his massing army in his seat, or rather hov‐
333 ering ring, of power. It dipped slightly as he flew low over his troops
334 marching through the viscous marsh-like terrain. They were like chil‐
335 dren: obedient, loyal, and they ate a lot.
336
337 Glancing at the status panel mounted in front of him he grimaced; the
338 other five armies: Yellow, Green, Orange, Turquoise, and, of course,
339 Red, were also readying armies of a similar size to his own. His violet
340 clones would have to fight hard and eat well to win this day.
341
342 Today would not be a battle of luck, the General mused, it would be a
343 battle of tactics, of alliances, and of betrayal. Every clone was iden‐
344 tical - that was the general idea behind clones - and the terrain
345 seemed strangely symmetrical; it would not give advantage to any of the
346 six armies amassed today. Glancing at the hologram of the battlefield
347 projected in front of him the General noted that he would have to move
348 quickly, Orange and Yellow were too close for comfort, though fortu‐
349 nately Baron Red's army of eponymous coloured clones was the furthest.
350
351 General Violet's fingertips were sweaty even before they touched the
352 four main control keys in front of him. They were labeled 'W', 'A',
353 'D', and, of course, the full retreat button - very useful for mislead‐
354 ing foes and ambushing them as they pursued - 'S'. The keys were
355 arrange in a roughly equilateral triangular pattern; with 'S' forming
356 the base and being adjacent to both 'A' and 'D', 'W' formed the tip of
357 the triangle.
358
359 A long breath left his parched lips as at last he made his move.
360
361
362 ...
363
364 "Dammit!" he screamed moments later. He had misjudged Captain Yellow
365 and Commander Orange; he had expected one at least to attack immedi‐
366 ately, one he could have handled. They were working together - foiling
367 his attempt to shoot between them to near the center of the battlefield
368 to gain a better vantage point. Yellow had shot down towards him, cut‐
369 ting off his advance, and now Orange had sealed his escape route. "It's
370 not over yet" muttered the General. He opened a voice channel with Com‐
371 mander Orange:
372
373 "Very clever. Flawed, but still clever."
374
375 "Flawed?" came the reply.
376
377 "Yes flawed, when the good Captain is finished devouring my army who do
378 you think he will turn to next?", bluffed the General - his hands
379 worked quickly as he manoeuvred his hovering control ring, all that his
380 troops ever saw of him, carefully towards the weakest section of his
381 attackers. If he could just break out a few units he could soon turn
382 the tide against both Yellow and Orange.
383
384 "We have an alliance..." Orange's voice was unsure now.
385
386 Time for some sarcasm to through her even more off balance, thought the
387 General,
388
389 "I gathered", he spoke softly, slowly, and with too much meaning. Then
390 closing the channel he turned his attention back to his escape.
391
392
393 ...
394
395 "Yes!" wooped the ecstatic figure of the General. Fifty or so of his
396 troops had broken free undetected and were even now working their way
397 cautiously towards the camps of the Yellow army, only the front lines
398 were still actively fighting; this opening gambit of Yellow and Orange
399 had turned into a stale siege and Yellow's army had pitched tent.
400
401 General Violet steered his hovering guidance ring to the center of the
402 Yellow camp. His troops struck, both those who had got behind the lines
403 and those who were still besieged. Yellow reacted too slowly and sud‐
404 denly found that her army, was shrinking back from the onslaught. There
405 was nowhere to run to, and bye now her only ally - Commander Orange -
406 had abandoned her to her fate; he was too busy engaging Sir. Turquoise,
407 who had managed to escape from the slaughter that the Baron had caused
408 to the Turquoise ranks and was even now valiantly attacking the flanks
409 of the Orange troops.
410
411 A glance at the status panel showed that Yellow's life force was fading
412 quickly: 8%, 3%, 1%, Gone.
413
414 The General smiled, he always enjoyed getting the first kill, and by
415 now his armies life force had grown and his clones had replicated. With
416 his, now, formidable fighting force it was no problem to engulf both
417 Sir. Turquoise and Commander Orange's brawling armies and annihilate
418 them. Once again his army grew in size and power. Now if only the Baron
419 didn't notice that..., thought the General.
420
421
422 ...
423
424 "Too late!" yelped the General, now thrown into panic, as he saw the
425 approaching Baron. His army had also grown in size and power - having
426 fatally injured the Turquoise army within the opening moments of the
427 battle, and having finally managed to catch the elusive fleeing form
428 of, or what remained of, Emperor Green.
429
430 Gripping the controls harder the General thought quickly, his army
431 doesn't so completely outnumber me that this is already over, however
432 unless I can cause him to make a mistake that allows me to take the
433 upper hand then I will inevitably lose. Maybe I can...
434
435 This thought was terminated and replaced by another as the Baron's
436 angry red troops broke through the undergrowth that had covered their
437 movements and started to surround the General's army. The thought that
438 now throbbed through the panic-stricken mind of General Violet was sim‐
439 ply 'Run!'.
440
441 Even as he signaled the retreat and made for what seemed to be the only
442 possible means of escape the Baron's blood red control ring appeared at
443 the opening. The General knew it was over, even before the host of red
444 beings appeared at the opening.
445
446 There was no escape. His life force was almost depleted and he was sur‐
447 rounded. Then it was that the Baron decided to communicate:
448
449 "Too bad. It was a good game"
450
451 The General blinked, gaped, and was generally gobsmacked. Just before
452 his life force completely failed and his own weary eyes closed in
453 defeat he snarled,
454
455 "What!? This is not a game!" were the General's dying words.
456
457
458
460 Introduction
461 This section describes how the GUI works. Since programming advanced
462 GUIs with Allegro is not so easy - standard C programming definitely
463 lacks flexibility -, and also since it's somewhat hard for me to figure
464 out what is user-friendly and what's not, Liquid War's menus are not
465 always self-explanatory. I'll just try and do something better next
466 time!
467
468
469 Menus
470 Map menu
471
472 The map menu allows you to choose the map you are going to play on. A
473 map is defined by 3 things:
474
475 * A frame. The frame can be chosen with the slider which is below the
476 preview. The frames are automatically sorted by alphabetical order.
477
478 * A texture for walls.
479
480 * A texture for the zone where fighters are allowed to move.
481
482
483 In the middle of the screen, there is a preview of the level. In this
484 menu, the values of the parameters can be independently changed by:
485
486 * Moving a slider.
487
488 * Clicking on a "+" or a "-" button.
489
490 * Typing a number.
491
492
493 On each side of the preview, sliders allow you to choose the two tex‐
494 tures. There is also a preview of each texture. Below this preview
495 there are 128 little buttons which allow you to choose single colored
496 textures.
497
498 The name of the map and its resolution are displayed in the lower part
499 of the screen.
500
501 You'll notice that on some maps the texture selection zones simply dis‐
502 appear. This is because these maps are associated with a texture, so
503 choosing a different texture is often not recommended for it won't look
504 as nice as with the right one. If you still want to override this be‐
505 haviour you can click on the "on/off" button just right to the "Use
506 default texture" label. This is a toggle button which will allow you to
507 use your own textures even on maps that normally come with their own
508 skin.
509
510 You'll also notice that a "Random map" button is available. This button
511 generates a new random map using an external program, "lwmapgen",
512 developped by David Redick, available on http://www.cs.clem‐
513 son.edu/~dredick/lwmapgen/
514
515 This program supports many command line options, and if you want a very
516 precise control on the generated maps, you'll need to run it sepa‐
517 rately. Looking at LW's log file you should be able to see the commands
518 LW issues when calling this program, this can give you ideas on how to
519 launch it manually. Alternatively using the "--help" option (for
520 instance "liquidwar-mapgen --help" under UNIX) should describe how to
521 use it.
522
523
524 Teams menu
525
526 This menu allows you to choose the teams which are going to play. There
527 are 6 square zones in this menu. Each of them is associated to a team.
528
529 Each team can be either:
530
531 * Disabled ("Off")
532
533 * Controlled by a player ("Human")
534
535 * Controlled by the computer ("Cpu")
536
537
538 The computer plays poorly, so remember that Liquid War is basically a
539 multiplayer game, and that the cpu control is dedicated to beginners
540 only.
541
542 You can also choose the color associated to each team by clicking on
543 one of the 12 colored buttons.
544
545 Below the 12 colored buttons, there are four buttons which allow you to
546 choose your keys. Click on one of these buttons and then press the key
547 you want to define. Joystick movements and buttons are considered as
548 keys. You can disable the joystick with the button which is at the bot‐
549 tom left of the menu. Mouse input is also possible, and mouse movements
550 are considered as keys too. To define mouse control, click on the but‐
551 ton associated to the direction you want to control, and then move the
552 mouse. Then the button should display something like "M->". Mouse sen‐
553 sibility can be set with the little slider at the bottom right of the
554 menu.
555
556
557 Graphics menu
558
559 Here you can choose the graphic options of the game.
560
561 The "Video mode" button allows you to switch between fullscreen and
562 windowed mode. This button is not available under DOS.
563
564 The "Brightness" slider allows you to set the brightness of the game.
565
566 The "Menu res" slider allows you to set the resolution used by the
567 menus. There are currently 5 possible values, which depend on which
568 platform you're running the game on.
569
570 I personnaly think the menus look best with the 640x480 resolution, but
571 some may prefer higher resolutions. Lower resolutions should only be
572 used if you have problems using SVGA video modes.
573
574 The "Game res" slider allows you to set the resolution used during the
575 game. The allowed values are the same than those for the menus. I rec‐
576 ommend that you don't use resolution higher than 640x480, unless you
577 have a Pentium VIII running a 10GHz.
578
579 Page flipping can be toggled. It is up to you to decide wether you keep
580 this option or not. The main disavantage of turning page flipping off
581 is that the info bar and the battlefield can look rahter ugly if they
582 overlap. But if you turn page flipping on you will not easily reach the
583 166 frames per second I sometimes get on small levels with my K6-225. I
584 personnaly always turn page flipping off.
585
586 The viewport size defines how much of your screen will be used by the
587 battlefield.
588
589 * If you set the slider on its left position, the batllefield will not
590 be stectched at all. Or if is strechted, it will be by a x2 or a x4
591 factor. So this is the mode wich allows the fastest display.
592
593 * If you set the slider ont its right position, the game will run in
594 fullscreen mode.
595
596 * With all the other positions of the slider, the battlefield will
597 keep its general proportions but it will be stretched.
598
599
600 The "Waves" button allows you to toggle the wave effect. You can also
601 do this while playing, by simply pressing F4.
602
603
604 Sound menu
605
606 This section allows you to set the sound volumes. There are 4 sliders,
607 which are:
608
609 * "Sfx": sets the volume of all the sfx sounds, thats to say'the
610 sounds you hear when the game starts, when you loose etc...
611
612 * "Click": sets the volume of the click, this nasty noise you hear
613 each time your press on a button.
614
615 * "Game water": sets the volume of the blop blop blop sounds which are
616 played continuously while you are playing.
617
618 * "Menu water": the same thing than "Game water" except that it con‐
619 cerns the sounds played while your are choosing options.
620
621 * "Music": general music volume.
622
623
624
625 Rules menu
626
627 This menu is the one where you can change the rules of the game.
628
629 The "Time" slider controls the time limit. The game will stop after
630 this time is elapsed. You can pause the game by pressing the "F3" key.
631
632 By the way, an info bar can display the time left while you are play‐
633 ing. This info bar can be toggled during the game by pressing the "F1"
634 key, and you can change its location by pressing the "F2" key. It also
635 displays how many fighters there are in each team.
636
637 The "Army size" slider controls the amount of fighters there will be on
638 the battlefield. The position of the slider reflects the amount of
639 fighters of all the teams together. If there are 4 teams, then each
640 player will have half as many fighters than if there had only been 2
641 teams.
642
643 The "Cursor x" slider controls the speed of your cursor.
644
645 * If it is set on the left, the cursor goes at the same speed than the
646 fighters.
647
648 * If it is centered, the cursor goes twice faster than the fighters.
649
650 * If it is set on the right, the speed of the cursor is multiplicated
651 by 3.
652
653
654 Below is a "Min 160x100" box with a slider on its right. This means
655 that maps will automatically be magnified so that they have a size of
656 at least 160x100. Indeed, some of the maps that come with Liquid War
657 were designed in 1995 when 486 Intel computers were common. Therefore
658 the maps were smalls. Today, these maps are not really fun to play on
659 fast computers, so Thomas Harte suggested this automatic magnifying
660 feature, and that was IMHO a smart idea. You can move the slider to the
661 right to make maps use a higher resolution - ie magnify them.
662
663 The "Defaults" button of the "Rules" menu will reset rules to their
664 defaults. This way you can tweak rules and then come back to the
665 default rules whenever you want. Note that there's also a "Defaults"
666 button in the main "Options" menu, but it will reset *all* options,
667 including player names... The advantage of the "Defaults" button in the
668 "Rules" menu is that it will only reset rules parameters, and keep the
669 rest of your configuration options untouched.
670
671
672 Speeds menu
673
674 The "frames/s" slider allows you to limit the number of frames per sec‐
675 ond. If this slider is set on the left, there won't be any limit, so
676 Liquid War will repaint your screen each time the fighters move. But
677 this can be a weird behaviour if your machine is really fast, for no
678 one cares about 100 fps per second, one can not even see them... So
679 this paramters limits the refreshment rate, so that there can be sev‐
680 eral logical moves of the fichters for only one screen refreshing. If
681 it is set on its right, the display is limite to 10 fps, so you'll have
682 to find your setting. I personnally set it right in the middle, and get
683 40 fps. If you press "F5", you'll get the number of frames per second,
684 and if you press "F6", you'll get the number of logical moves per sec‐
685 ond. You can also press "F7" or "F8", and you will get the percentage
686 of time your computer spends on calculating or displaying the level.
687
688 The "rounds/s" slider allows you to limit the number of rounds per sec‐
689 ond. If this slider is set on the left, there won't be any limit, so
690 Liquid War will run as fast as possible. This setting will be of no use
691 if you use Liquid War on a slow computer or if you play with hudge
692 maps, but sometimes, with a high-end Pentium class computer, it's sim‐
693 ply impossible to play on small maps because things simply go too fast.
694 So this parameter is here to help you and avoid the "10000 moves per
695 sec" problem.
696
697
698 Waves menu
699
700 This is where the wave parameters are set. The waves are just a graphic
701 effect, which is not really usefull. I don't often use waves, but I
702 still think they can sometimes look nice. Change these parameters if
703 you really mean to do it, but if you don't understand what they mean,
704 it is really OK...
705
706 There are 4 different types of waves, each of them being defined by:
707
708 * An "Ampli" parameter, to define how big the waves have to be.
709
710 * A "Number" parameter, to define how many waves should be displayed
711 at the same time.
712
713 * A "Speed" parameter, to define how fast the waves should move.
714
715
716 If you want to undestand what the "WX", "HY", "WY", and "HX" codes
717 mean, try to pay with only one type of wave, the "Ampli" parameter of
718 the 3 other types of wave being set to 0 (that is to say the slider is
719 on its left position), and sea how it looks like.
720
721 The wave effects can be toggled during the game by pressing the "F4"
722 key.
723
724
725 Advanced menu
726
727 This menu allows the user to change the behaviour of the fighters.
728
729 The "Attack" slider sets the agressivity of the fighters. If it is set
730 on the right, fighters eat each other very fast. If it is set on the
731 left, it takes ages to fighters to change teams.
732
733 The "Defense" slider sets the capacity that the fighters have to regen‐
734 erate themselves. The more it is on the right, the faster fighters
735 regenerate.
736
737 The "New health" slider sets the health of the fighters which have just
738 changed teams. The more it is on the left, the weaker these fighters
739 will be.
740
741 The "Winner help" slider controls a parameter which causes fighters to
742 attack with various strength depending on how many fighters belong to
743 their team. Not very clear... Let's just say that:
744
745 * If this slider is set on the right, the more fighters you have in
746 your team, the more aggressive they will become.
747
748 * If it is centered, all the fighters of every team will always attack
749 with the same strength.
750
751 * If it is set on the left, the less fighters you have, the stronger
752 they will be. In this mode, games usually never end.
753
754
755 The "Cpu strength" parameter never makes the computer more intelligent
756 than a monkey. But if you set it on the right, it advantages the
757 machine outrageously and fighters controlled by the cpu will be really
758 strong. So to get rid of them you'll definitely need to be clever.
759 Again and again, don't forget that Liquid War was conceived as a multi‐
760 player game and that playing against the computer is not really an
761 interesting thing to do.
762
763 The "CPU vs human" parameter allows you to control how aggressive CPUs
764 are towards humans.
765
766 * If set to "Always", CPUs will always attack humans and will never
767 try to attack another CPU, unless there are no humans left. This
768 used to be the default behavior in previous Liquid War versions, but
769 some players remarked that it was rather unfair, so now this is an
770 option.
771
772 * If set to "Random", CPUs won't care wether their opponents are CPUs
773 or humans, they'll attack anybody. This is the default behavior.
774
775 * It set to "Never", CPUs will attack each other before bothering
776 human players.
777
778
779 The "Allow net bots" button can be used to allow bots to connect on
780 network games. Indeed, bots are by default disabled in network games,
781 since in this case LW assumes that bots are useless (there are already
782 several human players). However, turning this option on will allow you
783 to connect bots within the game. It's important to note that this is a
784 per client option, this means that you can't use it to forbid access to
785 bots to a given network game. This option was simply created to avoid
786 confusion when connecting on network games, while still allowing bots
787 to connects if you really want them to.
788
789 The "Algorithm" parameter allows you to force the algorithm to standard
790 C mode. There's no real good reason you would like to do this, since
791 the C algorithm is slower than the ASM one. Moreover, the ASM algorithm
792 is automatically disabled if you play against a computer which does not
793 have ASM enabled. Think of this as a testing/debugging option.
794
795
796
797 Hot keys
798 Here's a list of keys you might use while playing:
799
800 * F1: toggles the "info" zone where the game time and the state of
801 each team is displayed.
802
803 * F2: moves the "info" the zone arround, possible positions being top,
804 right, bottom and left.
805
806 * F3: pauses the game. This function is disabled during network games.
807
808 * F4: toggles the "wave effect". Without this "wave effect", which is
809 turned on ny default,the game will run faster.
810
811 * F5: displays the number of frames per second (*).
812
813 * F6: displays the number of rounds per second (*).
814
815 * F7: displays the precentage of CPU spent on the game logic, calcu‐
816 lating where fighters must go for instance (*).
817
818 * F8: displays the precentage of CPU spent on graphics (*).
819
820 * F9: turns on/off the "capture" mode. In this mode, screenshots of
821 each frame are taken, and written to the hard drive as bitmaps.
822
823 * F10: quits the game right away without any confirmation prompt, also
824 known as the "my boss is coming here!" function.
825
826
827 (*) all these figures tend to be clearly false as computer go faster
828 and faster. Basically, the time required for "logic" and "display"
829 operations is getting shorter and shorter, and the tools I use to mea‐
830 sure it are not precise enough. Therefore I get approximations which
831 might by plainly wrong.
832
833
835 Basics
836 Since release 5.4.0, Liquid War includes network support, that's to say
837 that people can play over a LAN (Local Area Network). However, due to
838 limitations in Liquid War's legacy code, and also because of the lack
839 of time I have, it might be a little tricky to set up a network game at
840 first. So please read this section carefully.
841
842 You should keep in mind that:
843
844 * DOS only releases of Liquid War do not include network support, only
845 Windows and GNU/Linux versions will allow you to set up a network
846 game.
847
848 * The game should run fine on any LAN, but there's no garantee the
849 game will be playable on the Internet. Indeed if your "ping delay"
850 is not good enough, the game will be awfully slow. Bandwidth is not
851 an issue, since Liquid War rarely needs more than 2 Kb/sec.
852
853 * You'll need to know what an IP address is.
854
855 * You don't need to set up a network game to run a multiplayer game.
856 Liquid War was originally a multiplayer game without network sup‐
857 port. Network support is here only for people who don't feel com‐
858 fortable when playing at 6 on the same keyboard 8-)
859
860
861
862 Getting started
863 What do you need?
864
865 You'll basically need 2 computers connected on the same LAN. We'll call
866 them computer A and B. You might be able to play over the Internet too,
867 but the game can be harder to set up and - which is worse - very slow.
868
869 You'll also need to know the IP address of computer A. Type "ipconfig"
870 under Windows or "ifconfig" as root under GNU/Linux to get this infor‐
871 mation if you don't have it.
872
873
874 Starting the server
875
876 Liquid War uses a very traditionnal client/server approach. Basically,
877 the server gets informations from all the clients and then dispatches
878 the collected information to everybody.
879
880 So you'll need to start a server on computer A by running "liquid‐
881 war-server" on GNU/Linux or "lwwinsrv.exe" on windows. This is a con‐
882 sole application, ie it does not set up any graphic mode.
883
884 Here's a small example of a server start on GNU/Linux:
885
886 $ liquidwar-server
887 How many teams will connect to this server?
888
889 At this point you must enter a number between 2 and 6, and then press
890 "ENTER". In this example we will answer 2. The server really needs to
891 know how many teams will be in the game: when enough teams are con‐
892 nected, the game starts. It can also be a good idea to answer 6 system‐
893 atically and then force game start by clicking the "Start now" button
894 within the client. It's possible to skip this question by typing "liq‐
895 uidwar-server -2" instead of a plain "liquidwar-server".
896
897 Use "-2" to get rid of this question.
898 Register on "www.ufoot.org/metaserver/" (y/n)?
899
900 Now if we answer "y", then the server will automatically contact the
901 "meta-server" and it will be listed on "https://ufoot.org/liquid‐
902 war/v5/metaserver.php"
903
904 This can be convenient for people who want to find other gamers to play
905 with on the Net. For now, let's answer "n", we'll test this meta-server
906 stuff later 8-)
907
908 Use "-private" to get rid of this question.
909 2002-06-03 16:43:00: Listening on port 8035...
910 2002-06-03 16:43:00: Waiting for 2 teams...
911
912 Now the server is ready to accept clients. By default it listens to
913 clients on port 8035. You could change this behavior setting by calling
914 "liquidwar-server -port 8061" for instance, but let's use the default
915 port to make things easier.
916
917
918 Starting the clients
919
920 Start the client on computer A normally by typing "liquidwar" on
921 GNU/Linux or double-click "lwwin.exe" on Windows.
922
923 Go to the "Teams" menu and select 2 teams, a red human and a blue CPU
924 for instance. If you don't know how to do this, then try and play Liq‐
925 uid War on a single computer first. It's important to notice that by
926 default the "blue CPU" won't connect on the network game. It's possible
927 to allow bots to connect on network games, but they are disabled by
928 default.
929
930 Now come back to the main menu, and a "Net Game" button should be
931 available. Click it. Now you should be able to:
932
933 * Start the game.
934
935 * Change the IP address of the server.
936
937 * Change the communication port.
938
939 * Set a password.
940
941 * Search for internet games automatically.
942
943
944 Since the server is also running on the same machine (A), you can leave
945 the default IP address as is (127.0.0.1).
946
947 Now you are ready to start the second client on computer B. Like with
948 computer A, you'll have to:
949
950 * Select 2 teams, green an yellow this time.
951
952 * Select "Net Game" in the main menu.
953
954
955 But this time you'll also need to change the server address, since the
956 client is not running on the same computer than the server.
957
958 Now click on "Start game" on computer A. The server should play a "sys‐
959 tem beep", which is usefull if you run a server and want to be notified
960 of client connections without watching the console all the time, and it
961 should display messages like this:
962
963 2002-06-03 16:44:48: Connection from "127.0.0.1:34677"
964 2002-06-03 16:44:48: Team "Napoleon" on client "127.0.0.1:34677"
965 accepted
966 2002-06-03 16:44:49: Client "127.0.0.1:34677" accepted
967 2002-06-03 16:44:49: Waiting for 1 team...
968
969 And on the client you should see a screen which says "Waiting for 1
970 team(s)" with the list of connected players below (Napoleon). You do
971 not need to click on the "Start now" button.
972
973 Now click on "Start game" on computer B. The server should display mes‐
974 sages like this:
975
976 2002-06-03 16:49:14: Connection from "192.168.1.1:1098"
977 2002-06-03 16:49:14: Team "Henri IV" on client "192.168.1.1:1098"
978 accepted
979 2002-06-03 16:49:15: Client "192.168.1.1:1098" accepted
980 2002-06-03 16:49:15: Client "192.168.1.1:1098" ready
981 2002-06-03 16:49:15: Client "127.0.0.1:34677" ready
982 2002-06-03 16:49:15: Sending info to "127.0.0.1:34677"
983 2002-06-03 16:49:15: Sending info to "192.168.1.1:1098"
984 2002-06-03 16:49:16: Game start
985
986 And at that point, the game should start 8-)
987
988
989 Restart a new game
990
991 Once the game is over, you can start another network game on the
992 clients without touching the server, because the server automatically
993 restarts and waits for players to connect.
994
995 To stop the server - if you want to change its settings for instance -
996 just go to the console where it's running and press CTRL-C.
997
998
999 Using Docker
1000
1001 Docker (see http://docs.docker.com/ for details) is a convenient way to
1002 launch a server without re-inventing (rather, re-compiling) the wheel.
1003
1004 You might want to run the server this way if, for instance, you need to
1005 have it run on a remote box where you do not wish to install a complex
1006 Liquid War stack, Allegro and the rest.
1007
1008 Please visit "https://hub.docker.com/r/ufoot/liquidwar-server/" for a
1009 list of available images, once it's installed, running the server
1010 should amount to something like:
1011
1012 docker pull ufoot/liquidwar-server
1013 docker run -p 8035:8035 ufoot/liquidwar-server
1014
1015 Additionnally, images are provided to run the metaserver, which is
1016 responsible for registering and listing all running games. While
1017 there's no real reason to run your own since one should permanently be
1018 available on ufoot.org, it's quite straightforward to run your own:
1019
1020 docker pull ufoot/liquidwar-metaserver
1021 docker run -p 8053:8053 ufoot/liquidwar-metaserver
1022
1023
1024
1025 Using the meta-server
1026 Basics
1027
1028 The meta-server is a piece of software which is running on my web site,
1029 and allows servers to register themselves so that client can get a list
1030 of available servers.
1031
1032 It's written in PHP and is _very_ basic but I believe it's enough for
1033 what has to be done: maintain a list of running servers.
1034
1035 The source code for the meta-server is included in the source package
1036 of Liquid War, so you might run such a server yourself if you want to.
1037 However, by default, servers will register themselves on my web site,
1038 and will be listed on "https://ufoot.org/liquidwar/v5/metaserver.php"
1039
1040
1041 How to register a server
1042
1043 Launch the server, and when you get the question:
1044
1045 Register on "www.ufoot.org/metaserver/" (y/n)?
1046
1047 answer "y".
1048
1049 Note that if you're behind a proxy or a firewall, the server might be
1050 unable to register itself. Clients might also have problems to connect
1051 themselves on your server if there's a machine which does NAT (Network
1052 Address Translation) between you and the meta-server.
1053
1054
1055 How to find a server
1056
1057 In the main menu, click on "Net Game" and then "Search for internet
1058 games".
1059
1060 Now you should see a list of available servers. You can click on the
1061 items in the list to get more informations about a given server. Once
1062 you have chosen a server, click on "Join now".
1063
1064 Now you get on a "Waiting for teams" screen. You might be interested in
1065 using the "Start now" button. Indeed, if you are 4 players connected on
1066 a server that accepts up to 6 players, maybe you'll want to start the
1067 game right away without waiting for 2 more players. In this case, every
1068 player must click "Start now". A "*" character will replace the "-" in
1069 the players list when a player clicks on "Start now". When all the
1070 players are displayed with a "*a, the game starts.
1071
1072 You can also chat with other players by entering text in the area above
1073 the "Send message" button, and then click on this button. Keep in mind
1074 that this is a very primitive chat and that the best way to chat effi‐
1075 ciently is IMHO to play in windowed mode and have an IRC client at
1076 hand.
1077
1078 Note that you can also get the list of available servers from
1079 "https://ufoot.org/liquidwar/v5/metaserver.php" There you'll also find
1080 a little chat-box which will allow you to send exchange messages with
1081 other players.
1082
1083
1084
1085 Options
1086 Server options
1087
1088 You can pass options to the server using the command line. The follow‐
1089 ing parameters are accepted:
1090
1091 * "-n" where "n" is a number between 2 and 6 : with this option you
1092 can tell the server how many teams will connect to the game. Beware,
1093 there can be several teams on the same computer, so if you want to
1094 have a computer with 2 players on it and 2 other computers with a
1095 single player, then you need to use the "-4" option.
1096
1097 * "-lag n" where "n" is an integer : with this option, you can control
1098 the lag used at startup. Normally, Liquid War handles this parameter
1099 automatically, but you might want to force it to a given value.
1100
1101 * "-port n" where "n" is an integer : allows you to change the IP port
1102 used by the server to listen to the clients. if you omit this param‐
1103 eter, the default port is (8035) is used.
1104
1105 * "-log file.log" : dumps all informations in "file.log" instead of
1106 using the standard output.
1107
1108 * "-public" : skips the "Register on ..." question, and registers the
1109 server automatically on the meta-server, so that clients can find it
1110 easily.
1111
1112 * "-private" : skips the "Register on ..." question, and does not reg‐
1113 ister the server at all.
1114
1115 * "-comment This_is_a_comment" : associates a comment to the server,
1116 which will be displayed by the meta-server. Note that the character
1117 "_" will be replaced by spaces. This makes command line parsing eas‐
1118 ier. I'm lazy 8-)
1119
1120 * "-password xxx" : associates a password to the server. With this
1121 option, clients will need to give the right password to be able to
1122 connect on the server.
1123
1124 * "-callback cmd" : with this option, the command "cmd" will be
1125 launched whenever someone connects on an empty server. For instance,
1126 if you want to run a permanent server and want to know when someone
1127 connects but do not wish to permanently keep an eye on the server's
1128 log, you might use this option and put in "cmd" a command that auto‐
1129 matically sends you a mail. You might also use a command that fires
1130 a popup window. It's up to you. 2 sample scripts are available in
1131 the "misc" directory of the Liquid War source distribution. One is
1132 "misc/liquidwar_notify.sh" and works on UNIX platforms, and the
1133 other one is "misc/lwpopup.js", which is automatically used by
1134 "misc/lwserver.bat", and works on Windows.
1135
1136
1137
1138 Common options
1139
1140 These options work on both client and server, even if they are rather
1141 "server-oriented".
1142
1143 * "-metaserver url" : redefines the URL of the meta-server. Usefull if
1144 you want to use your own meta-server.
1145
1146 * "-netlog" : if you use this option, the server will dump all the
1147 network traffic on the standard output. This is usefull for debug‐
1148 ging.
1149
1150 * "-nobeep" : Disables the system beeps that the application might
1151 fire. These beeps are mostly used on the server to notify clients
1152 connections.
1153
1154
1155
1156
1157 About Liquid War's network implementation
1158 Basics
1159
1160 Liquid War uses TCP sockets, and a single-threaded server. This implies
1161 that:
1162
1163 * The game can sometimes get blocked if you play on Internet.
1164
1165 * The server can't talk simultaneously with several clients.
1166
1167
1168 I needed to use TCP sockets, since LW's algorithm can not cope with any
1169 data loss and it's not a reasonnable to try and anticipate what the map
1170 would be like if the player did not move etc...
1171
1172 I did not implement any complex multithreaded stuff since I'm lazy and
1173 however, clients need to have informations about all the other before
1174 something can be done. However, implementing a mutltithreaded server
1175 could have advantages over the current solution.
1176
1177
1178 What is this lag stuff anyway?
1179
1180 In Liquid War, all the clients send their key presses to the server,
1181 and then the server dispatches this information to everyone. This has
1182 to be done for every round.
1183
1184 You can easily imagine that if a player has a poor connection, with a
1185 very long "ping delay", it can take quite a long time to send the
1186 information to the server, and then get it back.
1187
1188 So what Liquid War does is that at the beginning of the game, the
1189 server sends a couple of "blank" key strokes to the clients. This way,
1190 clients receive data from the server before thay have sent any. The
1191 number of key strokes sent at the beginning of the game is called the
1192 "lag".
1193
1194 So if it takes 200 msec to send and then receive data from the server
1195 (approx the time returned by the "ping" command) then with a lag of 6,
1196 you can theorically play at a rate of (1/0.2)*6=30 rounds/sec.
1197
1198 On one hand, setting the lag parameter to a high value will avoid many
1199 network errors and allow you to play at a very fast pace, but the big
1200 drawback is that there will be quite a long time between the instant
1201 you send a key stroke to the server and the moment it comes back to
1202 you. On the other hand, setting the lag to a low value will limit dras‐
1203 tically he number of rounds per second, but make the game more "respon‐
1204 sive".
1205
1206 However, since release 5.4.1, the "lag" is modified automatically and
1207 should adapt itself to the situation. I've not been able to test it in
1208 real conditions yet, but it should work 8-)
1209
1210 Still, setting the lag to a sensible default value can save you some
1211 trouble. Indeed, by default, Liquid War will choose a value (6), but it
1212 can not guess if you are playing on Internet or on a 100 Mbit LAN, and
1213 it can take quite a long time before Liquid War automatically finds the
1214 right value. To know the right value which should be used with the
1215 "-lag" option, simply play a few games and watch the average lag (which
1216 is displayed on the server console every minute) at the end of the
1217 game.
1218
1219
1220 Performance issues
1221
1222 Liquid War uses a "light" server, and one of the advantages of this
1223 solution is that it allows you to run the server on low-end computers.
1224 I personnally run a permanent server on a 486 DX2, and it runs like a
1225 charm.
1226
1227 The only thing you have to take care of when running a server is band‐
1228 width. Don't worry, you won't need a 10Mbit connection, basically, each
1229 clients sends and receives 12 bytes of data at each round. If you add
1230 TCP/IP headers and the facts that stuff will probably be bundled in
1231 bigger packets, a client must deliver about 15 Kbit/sec (up and down)
1232 for a game that runs at 100 frames/sec. A 56K V90 modem is enough for
1233 this.
1234
1235 So if you run a server with 2 clients connected, the server will need
1236 to deliver 30 Kbit/sec in both ways. A 56K V90 modem _can_ do that, but
1237 your provider needs to be a good one 8-)
1238
1239 And if you run a server with 6 clients, you simply won't be able to
1240 reach the 100 frames/sec with a 56K V90 modem. It will necessarly drop
1241 to something less than 30 frames/sec, and is likely to drop to about 15
1242 frames/sec. OK this is not a big deal, since few Internet games run at
1243 more than 30 frames/sec, but well, if the server has troubles receiv‐
1244 ing/sending data, everyone will wait, and the fun will go away.
1245
1246 As a conclusion: if you have the choice, choose the friend who has the
1247 best bandwidth to run the server, without even considering the power of
1248 his computer.
1249
1250
1251
1252 Troubleshooting
1253 General information
1254
1255 Network support in 5.4 and 5.5 is still experimental in many ways, so
1256 you might get weird behaviors. Basically, if you have a problem, just
1257 do the following:
1258
1259 * Stop and restart the server when something goes wrong. To stop it,
1260 use CTRL-C.
1261
1262 * Check out that you have entered the correct IP addresses.
1263
1264 * Try and start the client and the server using the "-netlog" option
1265 to have an idea about what's happening.
1266
1267
1268
1269 Bugs in 5.4.x corrected in 5.4.2
1270
1271 Liquid War 5.4.0 and 5.4.1 were very hard to play over the Internet.
1272 The reason is that the network routines did not do enough error check‐
1273 ing, and therefore there were very often errors when sending and/or
1274 receiving the map to the server. Hopefully, this bug should not appear
1275 anymore in 5.4.2 or any other recent release.
1276
1277
1278
1279 About security
1280 Network games passwords
1281
1282 As you might have noticed, under the box where you can enter the pass‐
1283 word, a little notice explains that you must choose a "weak" password.
1284 Now you'll tell me -> people keep on explaining me that passwords must
1285 be something complex like "aS\r!Y9p" and now I'm told to use "hello",
1286 what's up?
1287
1288 OK, keep in mind Liquid War is a game. This password stuff is just a
1289 way to be able to play with your friends only and keep on using the
1290 meta-server's services. Liquid War does not encrypt data and I can see
1291 no good reason to do it for, so the password is stored and sent to the
1292 server in clear, as plain text.
1293
1294 The consequence is that if you use a valuable password - for instance
1295 the one you use to log in on your computer - the guy who runs the
1296 server will see your password in the log file if he wishes to. There‐
1297 fore, use something weak, something that if someones finds out what it
1298 is, you won't really care. So "hello" is a wise choice.
1299
1300
1301 Is Liquid War likely to have security holes?
1302
1303 Yes.
1304
1305 Any program is likely to have security holes, especially when it's net‐
1306 worked. However, I have good reasons to think that Liquid War is safe
1307 enough for a game. At least I find it safe enough to run a permanent
1308 public server on my personnal computer 8-)
1309
1310 FYI, here are some things which I think make Liquid War rather safe to
1311 run:
1312
1313 * Liquid War does not store anything on your hard drive that would
1314 have been received from the network. The maps are kept in RAM. So
1315 you won't download any virus playing Liquid War on Internet.
1316
1317 * Liquid War does not transmit any sort of code on the network. All
1318 the transmitted bytes represent plain data. So you're not likely to
1319 execute any arbitrary code - virus, worm - when playing on the Net.
1320
1321 * Liquid War receives network packets in static buffers, and if the
1322 received data is too big, it is truncated. One consequence is that
1323 Liquid War has a bunch of "limits". You can't send hudge maps over
1324 the network, you can't have long nicknames, and so on. But another
1325 consequence is that if you try to send garbage in the buffer, it
1326 will be truncated. Liquid War will protest with a "network error"
1327 message and the connection will be closed, but there will be no easy
1328 exploit possible here.
1329
1330 * Liquid War does not use the sprintf, strcpy and strcat functions,
1331 which are known as being rather unsecure since they can lead to buf‐
1332 fer overflows. Instead, it uses the equivalent functions snprintf,
1333 strncpy and strncat. On platforms where these functions are sup‐
1334 ported natively, the game will use the default system functions,
1335 otherwise it will use a free implementation by Mark Martinec. FYI,
1336 Windows does not support snprintf-like functions natively, that is,
1337 it's a piece of crap.
1338
1339 * Liquid War is Free Software, so I'm not likely to have put backdoors
1340 in it myself, since anyone can look at the source code 8-)
1341
1342
1343 However, I have not - and I know nobody who has - audited Liquid War
1344 for security holes. So there might be some. Therefore you should
1345 respect a few things while running Liquid War:
1346
1347 * Never run Liquid War as root or administrator. This is obvious but I
1348 still mention it. If you want to run a Liquid War daemon on UNIX,
1349 run it as user "nobody" or something approaching. If "root" or
1350 "administrator" does not make sense on your system (DOS, Win98...)
1351 then I assume you're not _really_ concerned about security anyway
1352 8-P
1353
1354 * If you run a server 7/7 24/24, use the "-log" option to log every‐
1355 thing in a file. This way you'll keep a trace of network activity,
1356 and if something goes wrong, you might get a chance to see it.
1357
1358 * If you use passwords in network games, *never* choose a valuable
1359 password. Use something simple like "hello" or "goodbye".
1360
1361 * Keep in mind that Liquid War is a game, and not a bullet proof pro‐
1362 fessionnal server.
1363
1364
1365 Last point: you should be aware that version 5.4.5 of Liquid War has
1366 been proved to be vulnerable to a local buffer overflow, and one should
1367 run at least 5.5.9 to get rid of this problem. FYI by the time the
1368 exploit was found on 5.4.5, 5.5.9 was already out 8-) See
1369 http://www.securityfocus.com/bid/8629 and http://www.securityfo‐
1370 cus.com/bid/9453 for more informations.
1371
1372
1373 Can people cheat when playing on the Net?
1374
1375 No.
1376
1377 Or at least, not really. In fact, you can still find the following
1378 types of lamers:
1379
1380 * A guy who lets the CPU play at his place. He'll loose anyway because
1381 the CPU is definitely not a great Liquid War Master 8-)
1382
1383 * A guy who tweaks the game and gets all his bots fight anyone he
1384 wishes. That's mean.
1385
1386 * A guy who manages to let you have a 500msec lag while he does not
1387 have any lag at all.
1388
1389
1390 Apart from this, I can hardly see any way to cheat. Why? Because the
1391 Liquid War server does not store any information about the game. It's
1392 not aware of who wins, who looses, it knows nothing. The only thing it
1393 does is to transmit key presses between client computers.
1394
1395 This way, if someone plays with a tweaked release of Liquid War, think‐
1396 ing he will fool you, then he will fool you on his computer only... On
1397 your computer, everything will be fine. After some time, your screen
1398 and his screen will have nothing in common, and both players are likely
1399 to think they have won. Except the lamer will stay a lamer.
1400
1401 This also explains why it's required to play with the very same ver‐
1402 sions of the game during network games. If you plug a 5.5.2 with a
1403 5.5.1, after a minute the screens will be completely different on each
1404 client, since there are subtle differences between the 5.5.1 and the
1405 5.5.2 engine. However, you shouldn't be able to do this, since a net‐
1406 work error will stop you before you can start to play.
1407
1408 Additionnally, versions 5.5.5 and higher have a checksum system. Every
1409 100 rounds, each client calculates a checksum with its local map, and
1410 sends it to the server. If the checksum is incorrect, the server will
1411 log a message like:
1412
1413 Checksum error on client "192.168.1.1:1098"
1414
1415 If you see this, then you're in one of the following situations:
1416
1417 * There's a bug in the game
1418
1419 * A lamer tries to cheat
1420
1421
1422 FYI, all releases from 5.4.0 to 5.5.4 have a bug which causes clients
1423 to desynchronize after a while...
1424
1425
1426
1428 Introduction
1429 When you launch Liquid War 5, you can use command line options. If you
1430 have no problems launching Liquid War, this section should not interest
1431 you very much.
1432
1433 You can use several options at the same time. The basic syntax for
1434 options looks like this:
1435
1436 lw -option1 -option2 parameter2 -option3 parameter3 -option4 -option5
1437
1438 Note that most of the options are legacy options which where usefull
1439 with the initial releases of Liquid War, when you had to run in a Win‐
1440 dows DOS box, and when there were still plenty of 486 computers with
1441 only 8Mb ram...
1442
1443
1444 Version checking
1445 These are basic options which can be usefull to figure out which
1446 release of Liquid War is installed.
1447
1448 * "-v" : returns the version number of the program.
1449
1450 * "-h" : displays a short description and copyright information.
1451
1452
1453
1454 Changing default paths
1455 Very usefull options, especially if you can not install Liquid War in
1456 default directories or want to put the game in a special place.
1457
1458 * "-cfg myconfigfile.cfg" : causes Liquid War to use the specified
1459 config file.
1460
1461 * "-dat mydatafilefile.dat" : causes Liquid War to use the specified
1462 datafile. This might be a very interesting option if you run Liquid
1463 War on a GNU/Linux box where you do not have root access and there‐
1464 fore can not put the datafile in /usr.
1465
1466 * "-map mycustommapdir" : causes Liquid War to use the specified
1467 directory as the user map directory. The user map directory is where
1468 you can put plain bitmaps to be used as maps.
1469
1470 * "-tex mycustomtexturedir" : causes Liquid War to use the specified
1471 directory as the user texture directory. The user texture directory
1472 is where you can put plain bitmaps to be used as textures.
1473
1474 * "-mid mycustommusicdir" : causes Liquid War to use the specified
1475 directory as the user music directory. Any midi file placed in this
1476 directory will be added to the list of available musics.
1477
1478 * "-server myliquidwarserverfile" : causes Liquid War to use the spec‐
1479 ified file as the server executable. This option has no effect for
1480 now since the server is not launched by the client.
1481
1482 * "-mapgen mylwmapgenfile" : causes Liquid War to use the specified
1483 file as the "lwmapgen" executable. "lwmapgen" is an utility by David
1484 Redick which generates random maps automatically for Liquid War. You
1485 might wish to change this option if random map generation does not
1486 work for some reason, or if you want to use your own map generator.
1487
1488
1489
1490 Troubleshooting switches
1491 These options give you control on how Liquid War treats initialisation
1492 errors, how much memory it should reserve, what kind of video mode sit
1493 should not choose etc...
1494
1495 * "-vga" : This option forces Liquid War to use your video card as if
1496 it was only a basic VGA card. This option is required if you play
1497 Liquid War from Windows NT.
1498
1499 * "-no400300" : This option disables the VGA 400x300 video mode. I
1500 created this options for I know that some video cards/monitors don't
1501 support the 400x300 mode.
1502
1503 * "-silent" : With this option, Liquid War will not play any sound. It
1504 will not search for any sound card. This can be interesting if you
1505 don't have any sound card or if Liquid War doesn't handle your card
1506 correctly.
1507
1508 * "-nowater" : Causes Liquid War not to load any water sound. Use this
1509 if Liquid War runs short of memory, and you should gain about 850kb.
1510
1511 * "-nosfx" : Causes Liquid War not to load any sound fx. Use this if
1512 Liquid War runs short of memory, and you should gain about 150kb.
1513
1514 * "-nomusic" : Causes Liquid War not to load any midi music.
1515
1516 * "-mem n" : The parameter "n" sets the amount of memory (in Mb) Liq‐
1517 uid War will allocate to do all its calculus. If this number is too
1518 small, you won't be able to play on all the levels. If it is too
1519 high, Liquid War may not start at all or crash while you are play‐
1520 ing. The default value is 8. If you play Liquid War from Windows and
1521 Liquid War refuses to run because this parameter is too high, then
1522 try and give more dpmi memory to Liquid War.
1523
1524 * "-nojoy" : This option disables joystick support.
1525
1526 * "-noback" : Causes Liquid War not to load the background image. Use
1527 this if Liquid War runs short of memory, and you should gain about
1528 300kb.
1529
1530 * "-notex" : Causes Liquid War not to load any texture. Use this if
1531 Liquid War runs short of memory, and you should gain about 750kb.
1532
1533 * "-auto" : If you set this option, Liquid War won't generate any
1534 error while allocating memory or loading data.
1535
1536 * "-safe" : With this option, you will play with a very reduced ver‐
1537 sion of Liquid War. It looks rather ugly but should work in a DOS
1538 box with only 4Mb of DPMI memory. Use this if you experience serious
1539 memory or device problems. If Liquid War doesn't start with this
1540 option turned on, I really don't think I can do anything for you...
1541
1542 * "-nice" : With this option, Liquid War will use a mode which is
1543 between the default mode and the "safe" mode.
1544
1545 * "-check" : With this option, Liquid War will stop as soon as it
1546 detects something strange while initializing.
1547
1548 * "-stop" : If you set this option, Liquid War will prompt you for a
1549 key when the init process is completed.
1550
1551 * "-c" : This is a weird option, if you turn it on, the game will only
1552 use fonctions which are programmed in C langage. The default behav‐
1553 iour is to use some functions I rewrote in assembly langage, so that
1554 the game is a little faster.
1555
1556
1557
1558 Debug options
1559 These options are usefull if you want to debug the game and trace
1560 what's happening.
1561
1562 * "-netlog" : Dumps all the network traffic on the standard output.
1563 This can help finding problems when trying to connect to the server
1564 in a network game.
1565
1566
1567
1568 Server options
1569 The server command line options are described in the section which
1570 deals which network games in general. IMHO you need to understand how
1571 network works in LW before trying to tweak the server 8-)
1572
1573
1574 Other options
1575 Everything else 8-)
1576
1577 * "-capture" : Activates the capture mode. In this mode, the game will
1578 dump a .bmp file on the disk several times per second, which is use‐
1579 full if you want to create an mpeg movie of your game session after‐
1580 wards. You can also activate this mode interactively by pressing F9
1581 within the game.
1582
1583 * "-metaserver url" : redefines the URL of the meta-server. Usefull if
1584 you want to use your own meta-server.
1585
1586 * "-nobeep" : Disables the system beeps that the application might
1587 fire. These beeps are mostly used on the server to notify clients
1588 connections.
1589
1590 * "-tombola" : Activates a special mode where scores are not displayed
1591 normally. Instead, the game displays 3 random numbers between 1 -
1592 500.
1593
1594
1595
1596 lwmapgen options
1597 The external lwmapgen program by David Redick accepts a number of com‐
1598 mand line options. You can type:
1599
1600 liquidwar-mapgen --help
1601
1602 to get a list of all available options under UNIX. Under Windows the
1603 command would be:
1604
1605 lwwinmap --help
1606
1607 Note that lwmapgen is called automatically by Liquid War when you click
1608 on the "Random map" button.
1609
1610 The idea behind lwmapgen is that you choose a function which sets the
1611 type of map generated, and then pass various arguments to this func‐
1612 tion. If you do not explicitly choose a function, one will be picked up
1613 for you randomly, and all other parameters will use default values.
1614
1615 The most usefull and common options are:
1616
1617 * "--help" : displays help.
1618
1619 * "--out filename" : save bitmap to filename.
1620
1621 * "--size n" : bitmap size (an integer between 0 and 5).
1622
1623 * "--list" : list all available functions.
1624
1625 * "--function function_name" : which function to use.
1626
1627
1628 Here's a typical use of lwmapgen:
1629
1630 liquidwar-mapgen --size 3 --function hole --out test.bmp
1631
1632
1634 General remarks
1635 Liquid War is now a cross-platform game, thanks to Allegro. So now you
1636 can play under different OS.
1637
1638 The same source tree will compile on all supported platforms, but with
1639 slight differences when running. C preprocessor #defines are used to
1640 code some platform specific stuff, and in some cases there are differ‐
1641 ent files for the DOS, Windows and UNIX versions.
1642
1643 As I said, I try to use the same code for all platforms. This is in the
1644 long term the best choice. Otherwise there would different branches of
1645 the source tree, and I don't think this is a very good solution.
1646
1647 Therefore some optimizations that were performed in the old DOS-only
1648 version have been totally removed, for they were 100% platform depen‐
1649 dent (ie mode-X asm coding). So the new versions are all a little
1650 slower than the old 5.1 stuff, but the performance loss is only about
1651 20%, which is not significant with today's PCs. And anyways the perfor‐
1652 mance loss is most of the time limited to the goog old VGA 320x200x8
1653 mode-X, which starts being kind of obsolete.
1654
1655
1656 DOS
1657 This is the original version. It's the fastest one as far as I know,
1658 the safest one and it will always be I think, since Allegro was first
1659 designed for DOS, and DOS allows a full unconditionnal access to all
1660 the hardware ressources LW requires. LW doesn't use any hardware accel‐
1661 eration and it's not been designed to do so. Unfortunately there's no
1662 network support for the DOS version of Liquid War.
1663
1664
1665 Windows
1666 When running under a Windows box, the DOS release used to be safer than
1667 the native Windows port. Now that DOS support is getting really poor
1668 with recent versions of Windows, the native Windows release of Liquid
1669 War starts begin the good choice for Windows users. And Allegro for
1670 Windows is getting quite stable in the 4.x series.
1671
1672 The other reason to choose this release rather than the DOS release is
1673 that it has network support.
1674
1675 If you have problems running Liquid War under Windows, please check out
1676 the "data\lwwin.log" file which should be written each time you run the
1677 game. It contains the information which is displayed on the console
1678 under other platforms, and might give you a clue about what's going
1679 wrong.
1680
1681
1682 GNU/Linux
1683 This port is the most recent one, and also the one I prefer. Paths have
1684 been changed to an UNIXish style, ie the data is stored in:
1685
1686 /usr/local/share/games/liquidwar
1687
1688 the executable in:
1689
1690 /usr/local/games
1691
1692 and the configuration file is
1693
1694 ~/.liquidwarrc
1695
1696 Since not all GNU/Linux distributions have /usr/local/games in their
1697 path, I also put a symbolic link to the binaries in /usr/local/bin. I
1698 believe Liquid War is quite FHS compliant, so if its default directo‐
1699 ries do not match your configuration, blame your distro for not follow‐
1700 ing the standards 8-) AFAIK the only touchy directory is
1701 /usr/local/share/pixmaps which I've seen on many distribution but does
1702 not seem to be referenced in the FHS.
1703
1704 With the latest releases of Allegro, Liquid War is becoming pretty sta‐
1705 ble under GNU/Linux. You should also know that the GNU/Linux port is
1706 usually the most up to date, since I very very seldom boot Windows at
1707 home and do most of the coding under GNU/Linux.
1708
1709
1710 FreeBSD
1711 This is the latest port, so I expect it to be a little touchy to
1712 install and/or run for some time.
1713
1714 Note that to compile the game you'll need to install GNU tools like
1715 gmake and gcc. Liquid War won't compile with the genuine make and cc
1716 commands.
1717
1718 One thing you might ask is: "why do you provide the binary as a plain
1719 .tgz file, it would be much nicer if a standard FreeBSD port was pro‐
1720 vided instead!". The answer is that the statically linked binary should
1721 work flawlessly and does not raise any dependency problem. Also I don't
1722 know how to make a BSD port and I'm not really interested in doing it.
1723 If it's easy to do, then someone can simply do it and send it back to
1724 me. If it's hard to do, then I do not really have the time nor motiva‐
1725 tion to do it. What I did is make the code and install scripts FreeBSD
1726 friendly so that it would be possible to compile the game under Free‐
1727 BSD. Packaging is another story.
1728
1729
1730 Mac OS X
1731 There's currently a beta version of a Mac OS X port for Liquid War.
1732 Ryan D. Brown nicely managed to compile and run the game under Mac OS
1733 X, and the latest news was that it does basically work. Still, this
1734 port did not go through intensive testing, so there might still be some
1735 bugs, expecially concerning networking.
1736
1737 There were some byte endianess problems in previous ( <=5.5.8 )
1738 releases of LW, but I tried to fix them and they should be gone now.
1739
1740 As of today, we're trying to find out a convenient way to package and
1741 release the Mac OS X version of LW. You can contact us on the mailing
1742 list if you're interested in this port.
1743
1744
1745 GP2X
1746 Liquid War has been ported to the GP2X handheld gaming platform, thanks
1747 to the fact George Foot ported Allegro to this platform. More informa‐
1748 tions on http://www.glost.eclipse.co.uk/gfoot/gp2x/allegro.html
1749
1750 Assuming the environment variables GP2X_USER_PREFIX (where you want
1751 Allegro to be installed) and OPEN2X_SYSTEM_PREFIX (where your open2x
1752 cross-compiler is) are defined, the following might be used to compile
1753 Allegro:
1754
1755 LDFLAGS=-static ./configure --prefix=$GP2X_USER_PREFIX
1756 --build=x86_64-pc-linux-gnu --host=arm-open2x-linux
1757 --enable-lgp2x=$OPEN2X_SYSTEM_PREFIX --without-x --enable-static
1758 --disable-shared --disable-modules --enable-dbglib
1759
1760 Then Liquid War itself can be compiled using:
1761
1762
1763
1764
1766 A piece of advice
1767 You can use your own levels whith Liquid War 5. The only thing you have
1768 to do is to put your own 256-colors vbitmap files in a special direc‐
1769 tory, and the program will use them. Currently, BMP, LBM, PCX, and TGA
1770 files are supported. It is a good thing to use 256 colors bitmaps, for
1771 they waste less disk space than truecolor bitmaps, and Liquid War 5
1772 converts all bitmaps to 32 colors bitmaps. Additionnally, truecolor
1773 bitmaps might cause the DOS version to crash randomly... 2-color bit‐
1774 maps will also cause the program to crash. I warned you!
1775
1776 The best thing you can do to create your user levels is to have a look
1777 at the few user files I put in the .zip file and try at first to do
1778 something that looks about the same!
1779
1780
1781 Maps
1782 Liquid War 5 does many checks on user levels and is much safer than
1783 Liquid War 3. Still, try and help the program not to crash, if possi‐
1784 ble.
1785
1786 Liquid War considers that dark colors are walls and bright colors are
1787 associated to the playable area. So you can draw your walls in black,
1788 dark blue, etc... And the rest of the map can be of any bright color
1789 such as white or yellow.
1790
1791 You can draw a small map on a big bitmap, as long as you use a bright
1792 background color. Liquid War will autodetect the range of your map and
1793 add the border line if necessary.
1794
1795 Liquid War re-orders all the maps, so that the smallest ones are on the
1796 left and the most complicated ones on the right when you choose them
1797 with the slider in the "map" menu. So if you can't find the map you
1798 just draw, don't worry, it is probably just mixed with the levels from
1799 the .dat file.
1800
1801 The default path for maps is "custom\map\" on windows, and
1802 "/usr/local/share/games/liquidwar/map" on GNU/Linux.
1803
1804
1805 Textures
1806 All you have to do is put a bitmap in the default directory which is
1807 "custom\texture\" on windows, and "/usr/local/share/games/liquid‐
1808 war/texture" on GNU/Linux.
1809
1810
1811 Textures
1812 As of Liquid War 5.6.x, it's possible to associate a map with a tex‐
1813 ture. All you need is to call the maps with the same name (case is
1814 important, lowercase recommendend...). Look at the "meditate" custom
1815 map which is shipped with Liquid War for instance.
1816
1817 This also works with internal builtin maps (those stored in the
1818 datafile) so for instance if you name a custom texture "world1.bmp" it
1819 will automatically be associated to the builtin map world1 (to figure
1820 out internal names you have to unpack the source distribution and look
1821 in the ./data directory). This also works the other way, if you name a
1822 map "wood2.bmp" it will be automatically associated with the builtin
1823 texture wood2.
1824
1825 Associating a texture with a map requires more work than designing a
1826 simple map, but the results is usually much nicer. See the "Kasper -
1827 ..." series of maps for instance.
1828
1829
1830 Send your levels
1831 Maybe you will find that the original levels are ugly and unplayable.
1832 Well, if you have made user levels and think they are great, just send
1833 them to the Liquid War user mailing list. Please use only 256 colors
1834 bitmap and zip them before sending them, or else they might be blocked
1835 by my provider...
1836
1837 As of today, dozens of user maps have already been included in Liquid
1838 War, this is very nice for it happens that every map designer has his
1839 own personnal tastes, so the maps all look different.
1840
1841 Still, to be included in Liquid War's mainstream distribution, your
1842 maps will need to be placed under the terms of the GNU General Public
1843 License, or at least a compatible license. You should have received a
1844 copy of this license with Liquid War anyway. Read it 8-)
1845
1846 Of course, you can use *any* map when playing. You can even play with a
1847 bitmap you got from a proprietary source - such a proprietary game you
1848 bought for instance - but the point is that I can't - and you can't
1849 either - distribute such a map along with Liquid War.
1850
1851 However, this is enough legal boring stuff! What you should keep in
1852 mind is that I'm always happy when I receive maps from players, and
1853 it's a pleasure for me to include them in the mainstream distribution.
1854
1855
1857 Introduction
1858 General remarks
1859
1860 If you have played Liquid War, you must have noticed that your army
1861 always takes the shortest way to reach the cursor. So the fundamental
1862 stuff in Liquid War is path-finding. Once you've done that the game is
1863 quite easy to code. Not harder than any other 2D game. Still the path
1864 finding algorithm is an interesting one, for it's not a common method
1865 that we used.
1866
1867 Basically, at each round (by round I mean a game logical update, this
1868 occurs 10 or 100 times/sec depending on the level and/or your machine),
1869 the distance from all the points of the level to your cursor is calcu‐
1870 lated. Now the point is to calculate this fast, real fast. In fact, a
1871 "gradient" is calculated for all the points of the level, and the value
1872 of this gradient is the distance required for a little pixel/fighter to
1873 reach your cursor, assuming that he takes the shortest way. Liquid War
1874 does this with a 10% error tolerance, and it's enough for keeping the
1875 game interesting.
1876
1877 Once you have this gradient calculated, it's not hard to move your
1878 fighters. Basically, you just have to move them toward the adjacent
1879 point that has the lowest gradient value, ie is the closest to your
1880 cursor.
1881
1882
1883 History
1884
1885 The Liquid War algorithm has been invented by my friend Thomas Colcom‐
1886 bet In fact the Liquid War algorithm has been invented before the game
1887 itself. The game came as a consequence of the algorithm, he just
1888 thought "mmm, cool, we could make a game with that!".
1889
1890 Later, I enhanced the algorithm, as I coded it. The consequences were a
1891 performance increase, especially on simple but big levels. I mean lev‐
1892 els with wide areas for teams to move. Still the basis of the algorithm
1893 remained the same.
1894
1895
1896 Pros
1897
1898 The Liquid War algorithm for path-finding is very efficient:
1899
1900 * When you have to move lots of different points toward one single
1901 point. Good thing that's the rule of Liquid War!
1902
1903 * When you have no clue about how your map will look like, ie if the
1904 walls are randomly placed. The complexity of the level doesn't
1905 influence much the speed of the algorithm. The size does, but the
1906 complexity, ie the number of walls, is not so important.
1907
1908
1909
1910 Cons
1911
1912 The Liquid War algorithm is very poor compared to other algorithms
1913 when:
1914
1915 * You have several target destinations, that's to say Liquid War would
1916 be really slow if there were 100 teams with 10 players only.
1917
1918 * You want to move one single point only.
1919
1920 * > You want the exact (100% sure) path. In fact, this algorithm finds
1921 solutions which approach the best one but you can never figure out
1922 if the solution you found is the best, and the algorithm never ends.
1923 In the long term, the algo will always find the best solution or
1924 something really close but I don't know any easy way to figure out
1925 when you have reached this state.
1926
1927
1928
1929
1930 Mesh
1931 Introduction
1932
1933 The first Liquid War algorithm used to calculate the gradient (the dis‐
1934 tance from a point to your cursor) for every single point of the map.
1935
1936 With Liquid War 5, I used a mesh system. This mesh system is a struc‐
1937 ture of squares connected together. Squares may be 1,2,4,8 or 16 units
1938 large or any nice value like that, and the gradient is only calculated
1939 once for each square. Squares have connections between them, and each
1940 connection is associated to a direction.
1941
1942 There are 12 directions:
1943
1944 * North-North-West (NNW)
1945
1946 * North-West (NW)
1947
1948 * West-North-West (WNW)
1949
1950 * West-South-West (WSW)
1951
1952 * South-West (SW)
1953
1954 * South-South-West (SSW)
1955
1956 * South-South-East (SSE)
1957
1958 * South-East (SE)
1959
1960 * East-South-East (ESE)
1961
1962 * East-North-East (ENE)
1963
1964 * North-East (NE)
1965
1966 * North-North-East (NNE)
1967
1968
1969
1970 Example
1971
1972 Well, let me give you an example, supposing that you level structure
1973 is:
1974
1975 **********
1976 * *
1977 * *
1978 * **
1979 * *
1980 **********
1981
1982 The * represent walls, that's to say squares where fighters can not go.
1983
1984 Then the mesh structure would be:
1985
1986 **********
1987 *11112233*
1988 *11112233*
1989 *1111445**
1990 *i1114467*
1991 **********
1992
1993 In this mesh, there are 7 zones:
1994
1995 * zone 1 has a size of 4. It's linked with zones 2 (ENE) and 4 (ESE).
1996
1997 * zone 2 has a size of 2. It's linked with zones 3 (ENE,ESE), 5 (SE),
1998 4 (SSE,SSW) and 1 (SW,WSW,WNW).
1999
2000 * zone 3 has a size of 2. It's linked with zones 5 (SSW), 4 (SW) and 2
2001 (WSW,WNW).
2002
2003 * zone 4 has a size of 2. It's linked with zones 2 (NNW,NNE), 4 (NE),
2004 5 (ENE), 6 (ESE) and 1 (WSW,WNW,NW).
2005
2006 * zone 5 has a size of 1. It's linked with zones 3 (NNW,NNE,NE), 7
2007 (SE), 6 (SSE,SSW), 4 (SW,WSW,WNW) and 2 (NW).
2008
2009 * zone 6 has a size of 1. It's linked with zones 5 (NNW,NNE), 7
2010 (ENE,ESE) and 4 (WSW,WNW,NW).
2011
2012 * zone 7 has a size of 1. It's linked with zones 5 (NW) and 6
2013 (WSW,WNW).
2014
2015
2016
2017 Why such a complicated structure?
2018
2019 Because it allows the module which calculates the gradient to work much
2020 faster. With this system, the number of zones is reduced a lot, and
2021 calculus on the mesh can go very fast. At the same time, this mesh
2022 structure is complicated to understand by us humans but it's very easy
2023 for the computer.
2024
2025
2026
2027 Gradient
2028 Introduction
2029
2030 For each zone defined in the mesh, LW calculates an estimation of the
2031 distance between the cursor and this zone.
2032
2033 The algorihm is based on the fact that to cross a zone which size is n,
2034 n movements are required. Easy, eh?
2035
2036
2037 Description
2038
2039 Here's the way the algorithm works:
2040
2041 for each turn of the game, do:
2042
2043 * pick up a direction between the 12 defined directions. They have to
2044 be chosen is a peculiar order to avoid weird behaviors from fight‐
2045 ers, but let's suppose we just pick up the "next" direction, ie if
2046 WSW was chosen the last time, we pick up WNW.
2047
2048
2049 and then for each zone in the mesh, do:
2050
2051 * Compare the potential of the current zone with that of its neighbor
2052 zone. The neighbor zone to be chosen is the one which corresponds to
2053 the direction which has been previously picked up, and by potential
2054 I mean "the distance to the cursor, estimated by the algorithm's
2055 last pass".
2056
2057 * If potential_of_the_neighbor_zone > (potential_of_the_current_zone +
2058 size_of_the_current_zone) then potentiel_of_the_neighbor_zone =
2059 potential_of_the_current_zone + size_of_the_current_zone
2060
2061
2062
2063 How can this work?
2064
2065 Well, just ask my friend thom-Thom, he's the one who had the idea of
2066 this algorithm!
2067
2068 The basic idea is that by applying this simple rule to all the zones,
2069 after a certain amount of time, it's impossible to find any place in
2070 the mesh where the rule is not respected. And at this time, one can
2071 consider the potiential is right in any point.
2072
2073 Of course when the cursor moves the potential has to be recalculated,
2074 but you see, cursors move really slowly in Liquid War, so the algorithm
2075 has plenty of time to find a new stable solution...
2076
2077
2078 Demo
2079
2080 It's possible to see this algorithm working by typing:
2081
2082 ufootgrad[n]
2083
2084 while playing, where [n] is the number of the team the gradient of
2085 which you want to view. The game is still running but you view a team's
2086 gradient being calculated in real time instead of seeing the fighters.
2087
2088 If you type ufootgrad0 the display comes back to normal mode.
2089
2090
2091
2092 Move
2093 Introduction
2094
2095 Once the gradient is calculated for any zone on the battlefield, it's
2096 quite easy to move the fighters, hey?
2097
2098 The following method is used to move the players:
2099
2100 * A "main direction" is chosen for the fighter, this direction is cho‐
2101 sen using the gradient calculated on the mesh.
2102
2103 * Knowing which direction is the main one, a "level of interest" is
2104 applied to the 12 defined directions.
2105
2106
2107 There are 4 "level of interest" for directions:
2108
2109 * Main directions: the direction calculated.
2110
2111 * Good directions: these directions should lead the fighter to the
2112 cursor.
2113
2114 * Acceptable directions: ok, one can use this direction, since the
2115 fighter shouldn't loose any time using it.
2116
2117 * Unpossible directions: wether there's a wall or using this direction
2118 means the fighter will be farer from his cursor than before, it
2119 always means that this direction will not be used, never.
2120
2121
2122
2123 Rules
2124
2125 The fighters will try to find any matching situation in this list, and
2126 chose the first one.
2127
2128 * The main direction is available, no one on it, OK, let's follow it.
2129
2130 * There's a good direction with no one on it, OK, let's follow it.
2131
2132 * There's an acceptable direction with no one on it, OK, let's follow
2133 it.
2134
2135 * The main direction is available, but there's an opponent on it, I
2136 attack! By attacking, one means that energy is drawned from the
2137 attacked fighter and transmitted to the attacker. When the attacked
2138 fighter dies, he belongs to the team which killed him.
2139
2140 * A good direction is available, but there's an opponent on it, I
2141 attack!
2142
2143 * The main direction is available, but there's a mate on it, I cure
2144 him. That's to say that energy is given to the mate. This way, when
2145 there's a big pool of fighters from the same team, they re-generate
2146 each other.
2147
2148 * None of the previous situations found, do nothing.
2149
2150
2151
2152 Tips and tricks
2153
2154 The behavior of the armies is quite tricky to set up. I had myself to
2155 try many algorithms before I came to something nice. In fact, I had to
2156 introduce some "random" behaviors. They are not really random for I
2157 wanted the game to behave the same when given the same keyboard input,
2158 but for instance, fighters will prefer NNW to NNE sometimes, and NNE to
2159 NNW some other times. By the way, I think Liquid War could stand as a
2160 nice example of the thoery of chaos.
2161
2162
2163
2165 General remarks
2166 Modularity
2167
2168 Liquid War 5 is basically a big C program. I've splitted the source
2169 code in many small files for I do not like to have to handle big mono‐
2170 lithic sources, but this does not mean Liquid War is very modular. In
2171 fact Liquid War 5 is quite bloated with global variables and other ugly
2172 stuff 8-(
2173
2174
2175 Coding style
2176
2177 To be honest, it's a big mess. You won't find 2 files coded in the same
2178 maner... OK, I'm exagerating a bit. From now I try to make an effort
2179 and stick to basic rules such as:
2180
2181 * use the GNUish-style indentation - the default Emacs mode in fact
2182
2183 * prefix global functions / variables / constants / types with
2184 lw_<NAME_OF_THE_file>_. For instance, a "do_it" function in myfile.c
2185 will be called lw_myfile_do_it
2186
2187 * use capitals for constants, globals and types only. All functions
2188 are in lowercase with "_" to separate words
2189
2190 * keep on using 8.3 filenames for .c source files. This is for better
2191 DOS integration. DOS version of Liquid War is still maintained, you
2192 know 8-)
2193
2194 * use English only for code and comments
2195
2196
2197 I might decide to rename and cleanup everything some day, for it would
2198 help other coders to understand what I wrote, but well, this is cer‐
2199 tainly not a thrilling task 8-/
2200
2201
2202
2203 Source files organization
2204 Main game code
2205
2206 Here you'll find the main() function, the main game loop, applica‐
2207 tion-wide constants and other global stuff.
2208
2209 It might be a good start if you want to hack the code.
2210
2211 * base.h: contains global constants used in many different files.
2212
2213 * game.c / game.h: contains the main game loop.
2214
2215 * main.c / main.h: the file where the main C function is declared.
2216 Doesn't contain much except calling init functions and running the
2217 GUI.
2218
2219
2220
2221 Menus
2222
2223 The menus are coded using the Allegro GUI system. While this system is
2224 very powerfull, it's IMHO not adapted to very complex GUIs, and one of
2225 its drawbacks is that it's not so easy to redesign something once
2226 you've coded it.
2227
2228 Besides, when I started coding the GUI in 1998, I did it in a rather
2229 ugly way, and now I'm paying for my being lazy at that time, since I
2230 spent hours coding when I want to change something 8-/
2231
2232 * about.c / about.h: contains the code for the about menu.
2233
2234 * advanced.c / advanced.h: contains the GUI advanced options menu.
2235
2236 * connect.c / connect.h: contains code for the "connect" menu which
2237 displays which players are connected to the server, before the game
2238 actually starts.
2239
2240 * controls.c / controls.h: contains the code for the controls menu.
2241
2242 * graphics.c / graphics.h: code for the graphic options menu.
2243
2244 * internet.c / internet.h: contains the code for the "Search for
2245 Internet games" menu, where one can pick up a running server auto‐
2246 matically with the help of the meta-server.
2247
2248 * language.c / language.h: contains the code for the "Language" menu.
2249
2250 * level.c / level.h: contains code for the menu where the player can
2251 select a level and its options (texture or color).
2252
2253 * menu.c / menu.h: contains the code for the main menu.
2254
2255 * netgame.c / netgame.h: contains the code for the net game menu.
2256
2257 * options.c / options.h: contains the code for the options menu.
2258
2259 * play.c / play.h: contains the code which ties the menu to the main
2260 gameloop.
2261
2262 * rules.c / rules.h: code for the rules menu.
2263
2264 * score.c / score.h: functions to display the scores at the end of the
2265 game.
2266
2267 * speeds.c / speeds.h: contains the code for the speeds menu.
2268
2269 * team.c / team.h: code for the team menu, where one choses which
2270 teams will play.
2271
2272 * volume.c / volume.h: code for the sound menu.
2273
2274 * wave.c / wave.h: code for the wave menu.
2275
2276
2277
2278 GUI tools
2279
2280 These files contain various utilities which are used in the menus.
2281
2282 * alleg2.c / alleg2.h: contains some tweaked allegro functions. I
2283 wanted to use bitmaps with sevral colors for my fonts, and change
2284 some of the allegro default behavior. So rather than modifying the
2285 allegro source code right in the library I copied it in this file
2286 and then modified it.
2287
2288 * back.c / back.h: this modules displays the background image.
2289
2290 * dialog.c / dialog.h: contains code for standard dialog boxes.
2291
2292 * error.c / error.h: contains functions to display error messages once
2293 the game is in graphical mode.
2294
2295 * help.c / help.h: generic functions to display the various help
2296 pages.
2297
2298
2299
2300 Core algorithm
2301
2302 Here's *the* interesting part. All the rest of the code is just sugar
2303 coat to display stuff, receive players commands, communicate with other
2304 computers, handle errors, etc... But the real thing is here!
2305
2306 It's funny to note that these files have almost not been modified since
2307 Liquid War 5.0.
2308
2309 It's also interesting to note that they represent a small percentage of
2310 the total amount of code in the game. This tends to prove - and I'm
2311 convinced of it - that game programming does not only consists in hav‐
2312 ing great ideas, but also requires a lot of "dirty" and boring work.
2313 Honestly, coding an option menu is as boring as coding Liquid War algo‐
2314 rithm is fun.
2315
2316 * fighter.c / fighter.h: contains code to move the armies, once the
2317 gradient has been calculated.
2318
2319 * grad.c / grad.h: this module calculates the gradient for each team.
2320 One could say it's the "kernel" of the game, since most of the CPU
2321 time is spent in this module (except if you have a slow display...).
2322
2323 * mesh.c / mesh.h: contains code to set up a usable mesh with a map.
2324 Mesh are re-calculated at each time a new game is started, the rea‐
2325 son for this being that meshes are *very* big so it would not be
2326 reasonnable to save them directly on the HD.
2327
2328 * monster.s / monster.h: assembly functions to speed-up the game. It's
2329 a replacement for some fighter.c functions.
2330
2331 * spread.s / spread.h: contains assembly replacements for some func‐
2332 tions of grad.c. These replacements do the same than the original
2333 ones from grad.c, but faster. Could still be optimized.
2334
2335
2336
2337 Moving cursors
2338
2339 It looks like nothing, but moving a cursor and deciding where it should
2340 go if there's a wall in front of it is not that easy, especially if you
2341 want things to work nicely.
2342
2343 * autoplay.c / autoplay.h: contains the code for the computer AI. This
2344 module simulates keypresses from the computer, then the computer is
2345 handled as any other player.
2346
2347 * move.c / move.h: provides an API to move the cursors.
2348
2349
2350
2351 User input
2352
2353 Until 5.4.0, Liquid War did not have network support. As it is designed
2354 to be multiplayer, one needed to have several players on the same com‐
2355 puter. The mouse also needed to be handled in a special way since cur‐
2356 sors can *not* pass walls in Liquid War. Additionnally, I wanted all
2357 input channels (keyboard mouse and joystick) to be handled in a unified
2358 way.
2359
2360 This explains why there's so much code for user input, when one would
2361 think at first sight that "polling the keyboard is enough".
2362
2363 * joystick.c / joystick.h: contains code to support joystick input. It
2364 wraps joystick buttons to virtual keyboard keys, so that joystick
2365 and keyboard behave exactly the same.
2366
2367 * keyboard.c / keyboard.h: contains code to handle key presses.
2368
2369 * mouse.c / mouse.h: wraps the mouse movements to virtual keyboard
2370 keys. This way the mouse can be used to control the players.
2371
2372
2373
2374 Initialisations
2375
2376 These files contain functions to intialize various game components.
2377 100% boring code.
2378
2379 * area.c / area.h: contains functions to create the game area. Basi‐
2380 cally it contains functions to create the data structures in which
2381 the level is stored during the game.
2382
2383 * army.c / army.h: functions to create the armies, and place them on
2384 the battlefield.
2385
2386 * asm.c / asm.h: various constants, macros and utilities to ensure
2387 that asembly code works correctly.
2388
2389 * bigdata.c / bigdata.h: I had a really hard time with the malloc
2390 function with DJGPP under Win95 dos box. I tried to have it working
2391 for hours and hours but my program kept being buggy. So I decided to
2392 allocate the memory myself, in a memory zone I create at startup.
2393 This is what this module does: create a huge memory zone and then
2394 give parts of it to the rest of the program.
2395
2396 * config.c / config.h: contains everything that is related to the game
2397 configuration. This module contains in global variables all the
2398 parameters that are stored in the config file.
2399
2400 * cursor.c / cursor.h: contains the code to init the cursors and place
2401 them on the battlefield at the beginning of the game.
2402
2403 * decal.c / decal.h: This module makes the link between teams and
2404 players. Its coding is quite ugly, for some modules in LW assume
2405 that when 2 teams are playing they are always teams 0 and 1. So when
2406 3 teams are playing are playing and the second team loses, one has
2407 to make team 2 become team 1. That's what this module is for.
2408
2409 * exit.c / exit.h: contains code that is executed when the game ends,
2410 it shuts down Allegro and displays messages on the console.
2411
2412 * gfxmode.c / gfxmode.h: contains code to set up the various video
2413 modes, and defines which modes are available for each platform.
2414
2415 * init.c / init.h: contains code to initialize Allegro with proper
2416 options and analyze failures.
2417
2418 * palette.c / palette.h: contains function to set up the current color
2419 palette. Liquid War uses different palettes, depending on what col‐
2420 ors are chosen for teams.
2421
2422
2423
2424 Graphics
2425
2426 Here lies most of the graphic functions in Liquid War. There's not that
2427 much code since Liquid War's strength is not its visual effects, but
2428 rather its gameplay.
2429
2430 The only "funny" thing is the wave effect. I'm quite happy with it, and
2431 honestly, I do think it is rather fast, given the fact that it uses no
2432 3D hardware at all.
2433
2434 * disp.c / disp.h: contains functions to display the battlefield.
2435
2436 * distor.c / distor.h: this module contains code to create the "wave
2437 effect". It uses a lot of data tables, and is quite complicated to
2438 understand...
2439
2440 * glouglou.s / glouglou.h: assembly module, it is a replacement for
2441 some functions of distor.c. It goes much faster but does the same.
2442
2443 * info.c / info.h: contains code to display the info bar. The info bar
2444 is the bar which display the time left and the amount of players for
2445 each team while the game is running.
2446
2447 * message.c / message.h: provides an API to display messages during
2448 the game. Very useful if you want to debug the game: you can trace
2449 and display anything.
2450
2451 * pion.c / pion.h: contains code to display the cursors.
2452
2453 * viewport.c / vieport.h: code to allocate and resize the zone where
2454 the map is displayed, also called "viewport".
2455
2456
2457
2458 Sound and music
2459
2460 Sound and music routines required some encapsulation, since the game
2461 must be able to run even if the sound and/or music did not load cor‐
2462 rectly.
2463
2464 * music.c / music.h: contains the code to control MIDI playback.
2465
2466 * sound.c / sound.h: functions to play sound.
2467
2468
2469
2470 Data management
2471
2472 These functions handle the datafile contents and also the custom data.
2473
2474 Note that the various utilities such as liquidwarcol, liquidwarmap and
2475 liquidwartex do not share code with the main executable. This is obvi‐
2476 ously a design error, for liquidwarmap will handle maps in a very poor
2477 way and is unable to autodetect map errors, whereas the game does it
2478 rather well. Blame the programmer.
2479
2480 * disk.c / disk.h: contains all the code to access data from the hard
2481 drive. In fact, all the HD access is done at startup.
2482
2483 * map.c / map.h: contains code to load the maps from a datafile raw
2484 data or a user defined bitmap to a usable structure in RAM.
2485
2486 * maptex.c / maptex.h: contains code to handle the "use default tex‐
2487 ture" option, and associate a map with a given texture automati‐
2488 cally.
2489
2490 * texture.c / texture.h: contains code to handle textures. Textures
2491 are stored in a special format which uses 5 bits per pixel.
2492
2493
2494
2495 Random map generator
2496
2497 Liquid War has a "generate random map" feature which is available
2498 within the game and also as an external program. The source code for
2499 the external program is in ./utils/lwmapgen in Liquid War source dis‐
2500 tribution. This program has been coded by David Redick, is also avail‐
2501 able on http://www.cs.clemson.edu/~dredick/lwmapgen/ and works on
2502 GNU/Linux. Compiling this program under DOS and/or Windows is untested
2503 and unsupported.
2504
2505 The random map generator within Liquid War - which of course works on
2506 any platform support by LW - uses for its greater part the same source
2507 code as the external lwmapgen program.
2508
2509 * random.c / random.h: wrapper for the map generator written by David
2510 Redick. It basically does the same as ./utils/lwmapgen/main.c except
2511 that it does it within Liquid War as it is running and not in an
2512 external independant program.
2513
2514
2515
2516 Time handling
2517
2518 Time handling is fundamental in a game. Time is used for visual effects
2519 (waves...) during the game, it's used to generate some pseudo random
2520 stuff, well, it's used everywhere!
2521
2522 Note that on the client, I use 2 "different" clocks. The first counts
2523 the "real" time, in seconds. The second one is counts "rounds" and is
2524 incremented by 1 at each game round.
2525
2526 * srvtime.c / srvtime.h: code used to handle time on the server, where
2527 Allegro's functions are not available.
2528
2529 * ticker.c / ticker.h: sets up a timer callback.
2530
2531 * time.c / time.h: functions to know how long the game has been run‐
2532 ning, knowing that it can be interrupted.
2533
2534
2535
2536 In-game utilities
2537
2538 These are various utilities use to monitor and control the game while
2539 one's playing.
2540
2541 * capture.c / capture.h: code used to capture the video output of the
2542 game and store it in .bmp files while playing.
2543
2544 * checksum.c / checksum.h: utilities to generate a checksum from a
2545 given game state. Used in network code to make sure all the clients
2546 stay synchronized.
2547
2548 * code.c / code.h: This file contains the code to handle key presses
2549 during the game. That's to say the pause key for instance.
2550
2551 * profile.c / profile.h: provides tools to calculate how fast the game
2552 is runnning and what operations slow it down.
2553
2554 * watchdog.c / watchdog.h: this module waits for "secret codes" to be
2555 typed while the game is running, and traps them.
2556
2557
2558
2559 Command line handling
2560
2561 OK, now to all the UNIX guys, I *know* there are many ways to do things
2562 in a better and simple way than I did. But keep in mind that in 1998,
2563 under DOS, I had a rotten command line and even now I need everything
2564 to work on both UNIX and Microsoft platforms.
2565
2566 These utilities are not perfect, but they work, that's all I ask them.
2567
2568 * basicopt.c / basicopt.h: handles basic command line parameters such
2569 as "-v" or "-h".
2570
2571 * parser.c / parser.h: contains code to parse and analyze the command
2572 line parameters.
2573
2574 * startup.c / startup.h: analyzes the command line parameters and
2575 stores them into global variables.
2576
2577
2578
2579 Locale support
2580
2581 Liquid War now has locale support. Basically, all the labels and texts
2582 in the UI are stored in constants. There's simply file per language.
2583
2584 Note to translators: if you decide to translate the menus in another
2585 language, keep in mind that all the translations must fit in the vari‐
2586 ous buttons and textboxes. The best resolution to test this - the one
2587 where letters take most place - is 640x480.
2588
2589 * lang.c / lang.h: contains code to handle language dependant stuff.
2590
2591 * langen.c / langen.h: contains code to handle English specific stuff.
2592
2593 * langfr.c / langfr.h: contains code to handle French specific stuff.
2594
2595
2596
2597 Log and various messages
2598
2599 OK, the API of the log routines is a piece of crap. Now I'm simply too
2600 lazy to change it. It works, that's all I ask.
2601
2602 BTW, there's a clear advantage in using custom-made log functions
2603 instead of plain calls to "fprintf(stderr,...". It might not be obvious
2604 for UNIX users, but think about Windows. Nothing like a "tail -f"
2605 there, nor a proper output redirection system. When a user clicks on
2606 the Liquid War icon, I want "console" information to be logged in a
2607 file!
2608
2609 * log.h: common header for logcli.c and logsrv.c.
2610
2611 * logcli.c: contains code to display messages on the console. It's
2612 usefull for console may have different behaviors when the games is
2613 used on different platforms. This file is used to compile the
2614 client.
2615
2616 * logsrv.c: contains code to display messages on the console. This
2617 file is used to compile the server, which does not use Allegro at
2618 all.
2619
2620 * popupgen.h: common header for popup functions.
2621
2622 * popupw32.c: code to handle popup on the Win32 platform. Popups are a
2623 must-have under Windows for error diagnostics, since the average
2624 Windows user never gives any look at any log file...
2625
2626
2627
2628 Macros, utilities and string support
2629
2630 As usual, I needed to prepare a small set of usefull macros.
2631
2632 * macro.h: contains basic wrappers/macros for snprintf like functions.
2633 This mostly to ease up string manipulation which is - as always - a
2634 nightmare in standard C.
2635
2636 * path.c / path.h: code used to handle filenames and paths, for
2637 instance remove path and file extension from a filename.
2638
2639
2640 It's also important to note that Liquid War uses snprintf instead of
2641 sprintf, for using the latter is very likely to cause buffer overflows.
2642 Under Linux glibc provides this function but Microsoft does not provide
2643 it natively on Windows. Therefore I used a third party snprintf imple‐
2644 mentation by Mark Martinec: http://www.ijs.si/software/snprintf/ and
2645 its source is available in the ./utils directory of Liquid War source
2646 distribution.
2647
2648
2649 Byte order and endianess
2650
2651 As you might know, PC Intel based computers are "little-endian" while
2652 Sun Sparc stations and Mac computers are "big-endian". This is an issue
2653 for LW since in network games maps are transmitted in binary format.
2654 Therefore I needed to set up some (un)serialization fonctions.
2655
2656 * serial.c / serial.h: code used to transform integers and map headers
2657 into an uniform cross-platform byte stream which is readable by both
2658 little and big endian machines.
2659
2660
2661
2662 Thread support
2663
2664 Liquid War does have thread support, but it is a "limited" thread sup‐
2665 port. I mean that the game is generally monothreaded, but a few func‐
2666 tions use threads. For instance, calls to the meta-server are done
2667 within threads.
2668
2669 Basically, I do not really enjoy programming in a multithreaded envi‐
2670 ronnement. So when possible, I chose the monothread path, and used
2671 threads only where I simply would not be able to find another accept‐
2672 able solution.
2673
2674 I also needed to use some mutexes to prevent crashes in the user inter‐
2675 face.
2676
2677 * mutxdos.c: provides fake mutex support under DOS. This module is
2678 here only to make compilation easier.
2679
2680 * mutxgen.h: header for mutxdos.c, mutxunix.c and mutxw32.c.
2681
2682 * mutxunix.c: provides mutex support on UNIX.
2683
2684 * mutxw32.c: provides mutex support on Win32.
2685
2686 * thrddos.c: provides fake thread support under DOS. This module is
2687 here only to make compilation easier.
2688
2689 * thrdgen.h: header for thrddos.c, thrdunix.c and thrdw32.c.
2690
2691 * thrdunix.c: provides thread support on UNIX.
2692
2693 * thrdw32.c: provides thread support on Win32.
2694
2695
2696
2697 Launching external programs
2698
2699 Liquid War might sometimes launch external programs. This is (for secu‐
2700 rity reason) not a default behavior and has to be activated and config‐
2701 ured by yourself, using the "-callback" command line option on the
2702 server for instance.
2703
2704 * execgen.h: header for execunix.c and execw32.c.
2705
2706 * execunix.c: code to launch external programs on UNIX.
2707
2708 * execw32.c: code to launch external programs on Win32.
2709
2710 * exec2.c: code to launch external programs within the client, without
2711 any interaction with the user, ie no unwanted popping window for
2712 instance.
2713
2714
2715
2716 Low-level network code
2717
2718 There are network packages for Allegro, but I decided not to use them.
2719 Socket support is not that hard to implement under UNIX and Win32 and
2720 besides, I've done it for my job recently, so I just knew how to do it.
2721
2722 Another reason which decided me to code my own toolbox is that I did
2723 not want Liquid War to have external dependencies - except Allegro of
2724 course. This way, UNIX gamers to not have to set up and/or download a
2725 specific network library. It's also easier to integrate the game in
2726 projects like Debian if it has few dependencies.
2727
2728 This network code is not a masterpiece, it's just a little set of tools
2729 that have proven to work. That's all.
2730
2731 BTW, it's important to notice that when linking with Allegro, most
2732 blocking UNIX calls ("sleep" or "recv" for instance) stop working: they
2733 alwasys return immediately. This led me to implement weird ugly hacks,
2734 like calling "recv" in a loop until it gets what it wants... This is
2735 theorically and practically a performance killer, but I found no other
2736 way to fix this. And FYI, this is not an Allegro bug, it's a feature
2737 8-)
2738
2739 * dnsutil.c / dnsutil.h: wrapper code to issue DNS requests, without
2740 having to handle the hostent struct.
2741
2742 * sock2cli.c: sode used to wrap low-level network function on the
2743 client.
2744
2745 * sock2gen.h: header for sock2cli.c and sock2srv.c.
2746
2747 * sock2srv.c: code used to wrap low-level network function on the
2748 server.
2749
2750 * sockdos.c: network API for DOS.
2751
2752 * sockex.c: netowrk routines shared by sockunix and sockw32.
2753
2754 * sockgen.h: header for sockdos.c, sockunix.c and sockw32.c.
2755
2756 * sockunix.c: network API for UNIX.
2757
2758 * sockw32.c: network API for Win32.
2759
2760
2761
2762 High-level network code
2763
2764 These files contains network utilities which are Liquid War specific.
2765
2766 * chat.c / chat.h: functions used to handle chat messages in network
2767 games.
2768
2769 * keyexch.c / keyexch.h: functions to send and receive keys to the
2770 server. Used on the client.
2771
2772 * netconf.c / netconf.h: code to send and receive the config of the
2773 clients over the network.
2774
2775 * netkey.c / netkey.h: contains some tools to manipulate key strokes
2776 over the network.
2777
2778 * netmap.c / netmap.h: code to send and receive the maps over the net‐
2779 work.
2780
2781 * netmess.c / netmess.h: contains a parser to interpret plain text
2782 messages. Used when exhanging information over the network.
2783
2784 * netplay.c / netplay.h: contains the code to set up and start network
2785 games.
2786
2787 * network.c / network.h: contains some network related functions and
2788 constants used on the client.
2789
2790 * ping.c / ping.h: code used on the client to estimate the average
2791 ping time with a server.
2792
2793 * protocol.c / protocol.h: contains the sequence of messages send and
2794 recevied by the client when connecting on the server.
2795
2796 * startinf.c / startinf.h: contains struct and tools to handle some
2797 network informations while starting a network game.
2798
2799
2800
2801 Communication with the meta-server
2802
2803 The meta-server is called by both client and server. Basically, the
2804 server registers itself, and the client asks for a list of servers.
2805
2806 The meta-server itself is just a set of simple PHP scripts with a sim‐
2807 ple MySQL database. I chose PHP because my provider allows execution of
2808 PHP pages, that's all.
2809
2810 The protocol is *very* basic, and uses HTTP 1.0 for requests. Answers
2811 are received in plain text, with one information per line. There's no
2812 garantee that this would work with any HTTP server, but experience
2813 proved that it works with my provider 8-)
2814
2815 * httputil.c / httputil.h: low level functions to handle http
2816 requests.
2817
2818 * wwwcli.c / wwwcli.h: code used on the client to communicate with the
2819 meta-server.
2820
2821 * wwwsrv.c / wwwsrv.h: code used on the server to communicate with the
2822 meta-server.
2823
2824
2825
2826 Server code
2827
2828 The Liquid War server is a rather small program. The only thing it does
2829 is accept new players, transmit map and game parameters between them,
2830 and then "replicate keys".
2831
2832 By "replicate keys" I mean that the server asks each client what keys
2833 have been pressed during the last round, and then dispatches this
2834 informations to all clients. This implies that the server has abso‐
2835 lutely no idea of who's loosing, who's winning, etc...
2836
2837 All the "logic" of the server is coded in these files, the rest is only
2838 utilities and helper functions.
2839
2840 * server.c / server.h: main code for the server (equivalent of main.c
2841 for the client).
2842
2843 * srvchan.c / srvchan.h: code used to handles channels on the server.
2844 A channel is associated to a given computer and may manage several
2845 teams.
2846
2847 * srvcont.c / srvcont.h: global network controler used on the server.
2848
2849 * srvteam.c / srvteam.h: code used to handle teams on the server.
2850
2851
2852
2853
2855 Report a new bug
2856 If you have troubles with Liquid War 5, if you think it is a bug, and
2857 if it is not described in this file, then just send a (precise...)
2858 decription of your problem to the Liquid War user mailing list.
2859
2860 Besides, it happens that now most bug reports come from the Debian
2861 tracking system "http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=liq‐
2862 uidwar". Thanks to the Debian users and maintainers, it's a very valu‐
2863 able feedback source.
2864
2865 Additionnaly, on online bug tracking system is availalable on
2866 "https://github.com/ufoot/liquidwar5/issues". I try to collect every‐
2867 thing here : bugs reported on the mailing-list, bugs from Debian, and
2868 bugs I found myself. Alternatively you can report bugs directly on it
2869 8-)
2870
2871
2872 Network
2873 Network support in Liquid War is far from being perfect, so there are a
2874 bunch of little problems which can appear. Basically, once the game is
2875 correctly started on a LAN, you should have no problems, but getting
2876 the game started might be difficult.
2877
2878
2879 Mouse does not work
2880 Some users reported that they were unable to control the Liquid War
2881 cursor with the mouse. Well, the answer is a typical Microsoftish "this
2882 ain't a bug, it's a feature!".
2883
2884 More seriously, you're supposed to move the cursor with the keyboard in
2885 Liquid War. There's no way to handle the cursor "like a mouse pointer"
2886 (*). This is due to:
2887
2888 * Severe limitations in the Liquid War core algorithm.
2889
2890 * The fact that moving the cursor "too fast" would really change the
2891 gameplay of Liquid War. As a Liquid War integrist 8-) I can tell you
2892 the game would really not be the same if you could move the cursor
2893 as fast as you wish. It's part of the game that sometimes it takes
2894 you ages to recover from a strategical mistakes. You need to think
2895 twice before going to the very end of a level. That's strategy. At
2896 least that's how I view things... Anyways as I mentionned above
2897 there's a limitation in the core algorithm.
2898
2899
2900 (*) This is not perfectly true, there's a way to control the cursor
2901 with the mouse, but it's designed for the case "4 people want to play
2902 on the same computer and one single keyboard is not enough". Control‐
2903 ling the cursor with the mouse in Liquid War is possible but yet rather
2904 hard to master 8-/ Try it and you'll understand what I mean. This mode
2905 can be set up in the "Teams" menu.
2906
2907
2908 Game does not start
2909 On non UNIX platforms such as Windows or DOS, Liquid War is distributed
2910 in a .zip file. It's IMPORTANT that you unzip the .zip files with an
2911 "unzipper" which preserves the directory structure. Most install prob‐
2912 lems under Windows come from broken unzipping programs which extract
2913 all files in the same directory... WinZip 8.x or the unzip32.exe util‐
2914 ity that comes with DJGPP are both able to uncompress Liquid War .zip
2915 files correctly.
2916
2917 On Liquid War 5.5.9 and later, the Windows version should detect this
2918 problem automatically and warn you with a message which basically says
2919 something like "Unable to load datafile. Are you sure Liquid War is
2920 correctly installed?". If you get this message, you need to reinstall
2921 the game by unzipping it with a "correct" unzipping program which does
2922 not wreck directory structrure up.
2923
2924
2925 Datafile bugs
2926 Sometimes there are some problems when compiling the datafile, this
2927 includes:
2928
2929 * The liquidwarcol, liquidwarmap and liquidwartex utilities might
2930 freeze or segfault. Typing "make" again often solves the problem.
2931
2932 * The background image sometimes ends up using the wrong palette,
2933 which has a very nasty consequence: it looks ugly.
2934
2935
2936 These bugs are quite hard to get rid off, since I can not reproduce
2937 them easily. The good solution would be to completely rewrite the liq‐
2938 uidwarcol, liquidwarmap and liquidwartex utilities.
2939
2940
2941 Midi does not work on OSS
2942 Preamble
2943
2944 IF your midi music on Liquid War, or indeed any other Allegro game,
2945 doesn't work and you are using the OSS (Open Sound System) drivers
2946 (these are the sound drivers which come with the standard kernel dis‐
2947 tribution), this may well be because Allegro only supports "FM synthe‐
2948 sis" and not "wavetable" when it is using OSS. FM synthesis is a very
2949 old method of making sound from MIDI and has long since been replaced
2950 by wavetable synthesis, with the net result that it's quite possible
2951 you've got OSS MIDI working nicely in other applications without having
2952 FM support set up at all. This is what I found. (It has to be said that
2953 I didn't find the FM sound quality quite as bad as people have said,
2954 though).
2955
2956 In this situation, it looks to me like you have the following choices:
2957
2958
2959 Hack Allegro...
2960
2961
2962
2963 and for the rest of us...
2964
2965
2966 Use Allegro's DIGMID midi driver...
2967
2968
2969
2970
2971 Get an FM driver up and running...
2972
2973
2974
2975 * Find out which FM driver is appropriate for your sound card. If you
2976 have distribution-specific tools and docs for setting up sound, try
2977 those. If not, you will need to be familiar with the knowledge in
2978 the Sound-HOWTO and Kernel-HOWTO i.e. know how to compile kernels
2979 and modules and deal with sound drivers.
2980
2981 * Look through the OSS modules in 'make menuconfig' and see if any‐
2982 thing catches your eye. See if there is any specific documentation
2983 on your sound card on http://www.linuxdoc.org. Do a few web
2984 searches. For my AWE64, I use the OPL3 driver.
2985
2986 * Compile and install the FM driver module, or set up your system to
2987 use the new kernel if you want to compile the driver in.
2988
2989 * Load the module, or boot your new kernel. It is very important that
2990 you pay attention to what is said in the 'help' for your FM driver
2991 in 'make menuconfig' and read any necessary files in the Documenta‐
2992 tion/sound/ directory. For example, I just had a nice half-hour won‐
2993 dering why the hell my FM wasn't working now when it had been before
2994 - with the OPL3 driver, you have to give the option io=0x388 to ins‐
2995 mod. Which is stated nice and clear in the docs, but of course I had
2996 forgotten since then. You can prevent such happenings by recording
2997 options permanently in /etc/modules.conf - see the manpage etc.
2998
2999 * Try the game. If it's worked you will hear particularly beepy music.
3000 Enjoy!
3001
3002
3003
3004 Opl3 occult FAQ
3005
3006 --IMPORTANT-- If you are using Liquid War, your FM will only work if
3007 you go to the map 'Elephant inside a boa' and proceed to chase each
3008 other round in circles for at least 10 minutes. This cures a bug in the
3009 design of the OPL3 interface which conflicts badly with the core Liquid
3010 War algorithms. How the hell the music hardware even knows about the
3011 core algorithms I don't know, but that's what I made of the now-defunct
3012 opl3-occult-FAQ, from which here is an excerpt:
3013
3014 Many roads a man must take. Those with one-track minds are DOOMED, I
3015 tells ya.
3016
3017 ---- The Liquid War algorithm calculates distances to one place, the
3018 cursor.
3019
3020 And:
3021
3022 Man or machine, face or code, must stand strong and solid; must not
3023 just ooze away as slime.
3024
3025 ---- We think it might just take objection to the whole 'slimy' nature
3026 of the LW beings. As well as it being LIQUID War.
3027
3028 So, our carefully tailored approach, is to firstly have the players
3029 going in all the possible different directions evenly by moving around
3030 the map in circles, and secondly to divert the opl3's attention from
3031 the general slimy liquidness of it all by emphasizing the solidity,
3032 reality, and natural goodness of that classic tapestry: an elephant
3033 inside a boa.
3034
3035 That and it's a f***ing ace level.
3036
3037
3038
3039 Checksum errors
3040 The Liquid War server is a "light" servers which - to some extent - has
3041 no idea about what is going on in the game. It simply replicates key
3042 strokes between clients and each client maintains its own game state.
3043 Normally, the game is designed so that given the same user input, it
3044 will behave exactly the same.
3045
3046 However, it happens that sometimes 2 clients can behave differently,
3047 and this is a (severe) bug. One consequence is that messages reporting
3048 "Checksum errors" appear on the server's and on the client's console
3049 output. This bug appears when using non-default rules settings. Basi‐
3050 cally, if someones tweaks his rules, then the checksum errors appear.
3051 Of course I double-triple checked that options were correctly sent on
3052 the network, but, well, could not fix the bug. Yet. The short term
3053 solution seems to play with default factory settings...
3054
3055 I'm highly interested in bug-reports concerning this problem.
3056
3057
3059 Bug-fixing
3060 In its latest releases Liquid War is quite stable IMHO. However there
3061 are still some issues with network under Windows for instance. I'm
3062 aware of these bugs and I'm trying to fix them but this does really
3063 take time.
3064
3065 I always welcome bug-reports and patches, as making Liquid War W 5.x.x
3066 as stable and bug-free as possible is really important to me - and most
3067 of the time players also appreciate stable programs 8-)
3068
3069 The most important bug-fixing area is probably cross-platform support.
3070 That is, make sure that the game runs fine on every supported OS. For
3071 instance, it's quite common for Mac OS/X and/or FreeBSD users to
3072 "crash" the game. This rarely happens on GNU/Linux, just because it has
3073 been so much more tested on this platform. This applies to Liquid War
3074 itself and also, to some extent, to Allegro.
3075
3076
3077 New features
3078 Let's be clear: no new features in Liquid War 5. It's bloated, compli‐
3079 cated, old, uninteresting to hack. All new features should be found in
3080 Liquid War 6.
3081
3082
3083 Liquid War 6
3084 Since summer 2005, Liquid War 6, a complete rewrite of Liquid War, is
3085 on its way. See http://www.gnu.org/software/liquidwar6/ or
3086 "https://ufoot.org/liquidwar/v6" for more informations.
3087
3088
3090 Note on releases
3091 Whenever Liquid War is released, I usually pass the good news to Fresh‐
3092 meat ( http://freshmeat.net/projects/liquidwar/ ). Then all releases
3093 are accessible from the main download page, which is
3094 "https://ufoot.org/liquidwar/v5/download".
3095
3096 Releasing the game takes time, for I want all binaries to install prop‐
3097 erly and sources to compile cleanly. Therefore there might be some
3098 delay before the time coding is over and the time a release is actually
3099 ready. So for impatients and/or for people who need to test out the
3100 very latest versions (eg someone who wants to compile the game on a new
3101 platform), it's possible to access the source repository directly.
3102
3103
3104 About GIT
3105 Historically, Liquid War has used CVS, GNU Arch (aka tla), and now uses
3106 git http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html.
3107
3108 So FYI the previously active CVS and GNU Arch repositories, on Source‐
3109 forge and Savannah, are currently unmaintained. It has moved to Github.
3110
3111
3112 How to get latest releases
3113 A typical git command would be:
3114
3115 git clone https://github.com/ufoot/liquidwar5.git
3116
3117 If you are interested, I can open this repository in read/write mode,
3118 however one of the points of git is that it is distributed and allows
3119 cooperative developpement with multiple depots, so this isn't manda‐
3120 tory. And anyways, importing myself patches received by email has never
3121 been a real burden.
3122
3123 Besides, most developpement is now done on Liquid War 6. See
3124 http://www.gnu.org/software/liquidwar6/ or "https://ufoot.org/liquid‐
3125 war/v6" for more informations.
3126
3127
3129 Liquid War is a multiplayer wargame.
3130
3131 Copyright (C) 1998-2018 Christian Mauduit (ufoot@ufoot.org)
3132
3133 This program is free software; you can redistribute it and/or modify it
3134 under the terms of the GNU General Public License as published by the
3135 Free Software Foundation; either version 2 of the License, or (at your
3136 option) any later version.
3137
3138 This program is distributed in the hope that it will be useful, but
3139 WITHOUT ANY WARRANTY; without even the implied warranty of MER‐
3140 CHANTABILITY or FITNESS FOR A partICULAR PURPOSE. See the GNU General
3141 Public License for more details.
3142
3143 You should have received a copy of the GNU General Public License along
3144 with this program; if not, write to the Free Software Foundation, Inc.,
3145 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
3146
3148 Christian Mauduit <ufoot@ufoot.org>
3149
3150
3151
3152
3153 v5.6.5 Liquid War(6)